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