我想知道是否有任何原因(除了整理源代码之外),为什么开发人员会Usings
在Visual Studio 2008中使用“删除未使用的”功能?
我想知道是否有任何原因(除了整理源代码之外),为什么开发人员会Usings
在Visual Studio 2008中使用“删除未使用的”功能?
Answers:
您有几个理由要删除它们。
using
随着代码随时间的变化,您将逐渐积累无意义的语句。另一方面,没有太多理由要保留它们。我想您可以省去删除它们的工作。但是,如果您这么懒,就会遇到更大的问题!
在我看来,这是一个非常明智的问题,响应的人们正在以一种非常轻率的方式来对待它。
我想说,对源代码的任何更改都必须是合理的。这些更改可能会带来隐性成本,因此提出问题的人员希望对此有所了解。正如一个人暗示的那样,他们没有要求被称为“懒惰”。
我刚刚开始使用Resharper,并且它开始在我负责的项目中提供警告和样式提示。其中包括删除多余的using指令,以及多余的限定符,大写字母等。我的直觉是整理代码并解决所有提示,但是我的业务负责人警告我不要进行不合理的更改。
我们使用自动构建过程,因此对SVN信息库的任何更改都会生成我们无法链接到项目/错误/问题的更改,并会触发自动构建和发行,而这些功能对以前的版本没有任何功能性更改。
如果我们考虑删除多余的限定符,则可能会导致开发人员感到困惑,因为我们的域和数据层仅由限定符区分。
如果我正确地使用了反名的大写形式(即ABCD-> Abcd),那么我必须考虑到Resharper不会重构我们使用该引用类名称的任何Xml文件。
因此,遵循这些提示并不像看起来那样简单明了,应予以尊重。
除了已经给出的原因之外,它还可以防止不必要的命名冲突。考虑以下文件:
using System.IO;
using System.Windows.Shapes;
namespace LicenseTester
{
public static class Example
{
private static string temporaryPath = Path.GetTempFileName();
}
}
此代码无法编译,因为名称空间System.IO和System.Windows.Shapes都包含一个名为Path的类。我们可以使用完整的类路径来解决它,
private static string temporaryPath = System.IO.Path.GetTempFileName();
或者我们可以简单地删除行using System.Windows.Shapes;
。
代码编译速度更快。
最近,我有了另一个原因,为什么删除未使用的导入非常有帮助且很重要。
假设您有两个程序集,其中一个程序集引用另一个程序集(现在让我们称为第一个程序集A
和被引用的B
)。现在,当您在A中有依赖于B的代码时,一切都很好。但是,在开发过程的某个阶段,您会发现实际上不再需要该代码,但是将使用状态保留在原处。现在,您不仅有一个无意义的指令,using
而且还有一个汇编引用,B
该引用在任何地方都没有使用,而已在过时的指令中使用。首先,这会增加编译所需的时间A
,因为B
也必须加载。
因此,这不仅是更清晰易读的代码的问题,而且还涉及在生产代码中维护程序集引用的问题,因为即使不是所有引用的程序集也都存在。
最后,在示例中,我们不得不将B和A一起运送,尽管B在A部分的任何地方都没有使用,而是在-部分中使用了using
。这将极大地影响加载程序集时的运行时性能。A
至少从理论上讲,如果为您提供了C#.cs文件(或任何单个程序源代码文件),则您应该能够查看代码并创建一个模拟其所需内容的环境。使用某些编译/解析技术,您甚至可以创建一个自动执行此操作的工具。如果至少是由您自己决定的,则可以确保您了解代码文件所说的所有内容。
现在考虑,如果为您提供了带有1000 using
条指令的.cs文件,而实际上仅使用了10条。每当您查看引用外部世界的代码中新引入的符号时,都必须遍历这1000行以弄清楚它是什么。这显然会减慢上述过程。因此,如果您可以将它们减少到10个,这将有所帮助!
我认为C#using
指令非常弱,因为您不能在不丢失通用性的情况下指定单个通用符号,并且不能使用using
别名指令来使用扩展方法。在其他语言(例如Java,Python和Haskell)中则不是这种情况,在这些语言中,您可以(几乎)准确地指定外界想要什么。但是,那么,我建议尽可能使用using
别名。