我想知道是否有任何原因(除了整理源代码)为什么开发人员使用Usings
Visual Studio 2008 中的“删除未使用”功能?
10 回答
有几个原因你想把它们拿出来。
- 这是毫无意义。他们没有增加任何价值。
- 这很令人困惑。该命名空间使用了什么?
- 如果你不这样做,那么
using
随着你的代码随着时间的推移而变化,你将逐渐积累毫无意义的语句。 - 静态分析较慢。
- 代码编译速度较慢。
另一方面,留下它们的理由并不多。我想您可以省去删除它们的麻烦。但如果你那么懒惰,你就有更大的问题!
我想说的恰恰相反——删除不需要的、不必要的 using 语句非常有帮助。
想象一下,您必须在 3、6、9 个月后返回您的代码 - 或者其他人必须接管您的代码并维护它。
如果您有一长串不需要的 using 语句,那么查看代码可能会非常混乱。如果该名称空间中没有使用任何内容,为什么要在其中使用?
我想就专业环境中的长期可维护性而言,我强烈建议让您的代码尽可能干净——这包括从中倾倒不必要的东西。更少的混乱等于更少的混乱,因此更高的可维护性。
马克
除了已经给出的原因之外,它还可以防止不必要的命名冲突。考虑这个文件:
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;
。
IntelliSense 弹出窗口中的选项较少(特别是在命名空间包含大量扩展方法时)。
理论上 IntelliSense 也应该更快。
在我看来,这是一个非常明智的问题,而回答的人却以相当轻率的方式对待这个问题。
我想说对源代码的任何更改都需要证明是合理的。这些变化可能会产生隐性成本,提出问题的人希望了解这一点。他们没有要求被称为“懒惰”,正如一个人所暗示的那样。
我刚刚开始使用 ReSharper,它开始对我负责的项目发出警告和样式提示。其中包括删除了多余的 using 指令,还有多余的限定符、大写等等。我的直觉是整理代码并解决所有提示,但我的业务负责人警告我不要进行不合理的更改。
我们使用自动构建过程,因此对我们的 SVN 存储库的任何更改都会产生我们无法链接到项目/错误/问题的更改,并且会触发自动构建和发布,而不会对以前的版本进行任何功能更改。
如果我们考虑删除冗余限定符,这可能会给开发人员造成混淆,因为我们的域和数据层中的类仅由限定符来区分。
如果我看一下正确使用不恰当的大写字母(即 ABCD -> Abcd),那么我必须考虑到 ReSharper 不会重构我们使用该引用类名的任何 Xml 文件。
因此,遵循这些提示并不像看起来那么简单,应该受到尊重。
删除它们。更少的代码查看和思考可以节省时间和混乱。我希望更多的人能保持简单、整洁和整洁。这就像在你的房间里有脏衬衫和裤子。它很丑,你必须想知道它为什么在那里。
代码编译得更快。
最近我有了另一个原因,为什么删除未使用的导入非常有用和重要。
假设您有两个程序集,其中一个引用另一个(现在让我们调用第一个A
和被引用的B
)。现在,当您在 A 中有依赖于 B 的代码时,一切都很好。然而,在您的开发过程中的某个阶段,您注意到您实际上不再需要该代码,但您将 using 语句留在原处。现在,您不仅有一个无意义的using
-directive,而且还有一个在过时的指令中没有使用的程序集引用。B
这首先增加了编译所需的时间A
,因为B
也必须加载。
因此,这不仅是关于更清洁和更易于阅读的代码的问题,而且也是在生产代码中维护程序集引用的问题,其中并非所有引用的程序集都存在。
最后,在我们的示例中,我们必须将 B 和 A 一起发送,尽管 B 没有在 A 中的任何地方使用,而是在 - 部分中使用using
。这将极大地影响加载程序集时的运行时性能。A
它还有助于防止错误的循环依赖,假设您在删除未使用的使用后还能够从项目中删除一些 dll/项目引用。
至少在理论上,如果给你一个 C# .cs 文件(或任何单个程序源代码文件),你应该能够查看代码并创建一个模拟它需要的一切的环境。通过一些编译/解析技术,您甚至可以创建一个工具来自动完成它。如果您至少记住了这一点,那么您可以确保您理解代码文件所说的所有内容。
现在考虑一下,如果给你一个 .cs 文件,其中包含 1000 个using
指令,而实际上只使用了 10 个指令。每当您查看引用外部世界的代码中新引入的符号时,您都必须通过这 1000 行来弄清楚它是什么。这显然减慢了上述过程。因此,如果您可以将它们减少到 10 个,那将会有所帮助!
在我看来,C#using
指令非常弱,因为你不能指定单个泛型符号而不会丢失泛型,并且你不能使用using
别名指令来使用扩展方法。在 Java、Python 和 Haskell 等其他语言中情况并非如此,在这些语言中,您能够(几乎)准确地指定您想要从外部世界获得什么。但即便如此,我还是建议尽可能使用using
别名。