123

我想知道是否有任何原因(除了整理源代码)为什么开发人员使用UsingsVisual Studio 2008 中的“删除未使用”功能?

4

10 回答 10

193

有几个原因你想把它们拿出来。

  • 这是毫无意义。他们没有增加任何价值。
  • 这很令人困惑。该命名空间使用了什么?
  • 如果你不这样做,那么using随着你的代码随着时间的推移而变化,你将逐渐积累毫无意义的语句。
  • 静态分析较慢。
  • 代码编译速度较慢。

另一方面,留下它们的理由并不多。我想您可以省去删除它们的麻烦。但如果你那么懒惰,你就有更大的问题!

于 2009-03-10T11:03:01.857 回答
25

我想说的恰恰相反——删除不需要的、不必要的 using 语句非常有帮助。

想象一下,您必须在 3、6、9 个月后返回您的代码 - 或者其他人必须接管您的代码并维护它。

如果您有一长串不需要的 using 语句,那么查看代码可能会非常混乱。如果该名称空间中没有使用任何内容,为什么要在其中使用?

我想就专业环境中的长期可维护性而言,我强烈建议让您的代码尽可能干净——这包括从中倾倒不必要的东西。更少的混乱等于更少的混乱,因此更高的可维护性。

马克

于 2009-03-10T11:23:44.180 回答
17

除了已经给出的原因之外,它还可以防止不必要的命名冲突。考虑这个文件:

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;

于 2013-10-09T17:32:06.363 回答
14

IntelliSense 弹出窗口中的选项较少(特别是在命名空间包含大量扩展方法时)。

理论上 IntelliSense 也应该更快。

于 2009-04-08T05:35:51.287 回答
14

在我看来,这是一个非常明智的问题,而回答的人却以相当轻率的方式对待这个问题。

我想说对源代码的任何更改都需要证明是合理的。这些变化可能会产生隐性成本,提出问题的人希望了解这一点。他们没有要求被称为“懒惰”,正如一个人所暗示的那样。

我刚刚开始使用 ReSharper,它开始对我负责的项目发出警告和样式提示。其中包括删除了多余的 using 指令,还有多余的限定符、大写等等。我的直觉是整理代码并解决所有提示,但我的业务负责人警告我不要进行不合理的更改。

我们使用自动构建过程,因此对我们的 SVN 存储库的任何更改都会产生我们无法链接到项目/错误/问题的更改,并且会触发自动构建和发布,而不会对以前的版本进行任何功能更改。

如果我们考虑删除冗余限定符,这可能会给开发人员造成混淆,因为我们的域和数据层中的类仅由限定符来区分。

如果我看一下正确使用不恰当的大写字母(即 ABCD -> Abcd),那么我必须考虑到 ReSharper 不会重构我们使用该引用类名的任何 Xml 文件。

因此,遵循这些提示并不像看起来那么简单,应该受到尊重。

于 2009-09-17T14:06:41.027 回答
5

删除它们。更少的代码查看和思考可以节省时间和混乱。我希望更多的人能保持简单、整洁和整洁。这就像在你的房间里有脏衬衫和裤子。它很丑,你必须想知道它为什么在那里。

于 2011-06-23T16:27:01.617 回答
4

代码编译得更快。

于 2009-03-10T11:01:25.340 回答
4

最近我有了另一个原因,为什么删除未使用的导入非常有用和重要。

假设您有两个程序集,其中一个引用另一个(现在让我们调用第一个A和被引用的B)。现在,当您在 A 中有依赖于 B 的代码时,一切都很好。然而,在您的开发过程中的某个阶段,您注意到您实际上不再需要该代码,但您将 using 语句留在原处。现在,您不仅有一个无意义的using-directive,而且还有一个在过时的指令中没有使用的程序集引用。B这首先增加了编译所需的时间A,因为B也必须加载。

因此,这不仅是关于更清洁和更易于阅读的代码的问题,而且也是在生产代码中维护程序集引用的问题,其中并非所有引用的程序集都存在

最后,在我们的示例中,我们必须将 B 和 A 一起发送,尽管 B 没有在 A 中的任何地方使用,而是在 - 部分中使用using。这将极大地影响加载程序集时的运行时性能。A

于 2016-03-03T09:22:43.887 回答
3

它还有助于防止错误的循环依赖,假设您在删除未使用的使用后还能够从项目中删除一些 dll/项目引用。

于 2010-11-15T23:55:41.003 回答
2

至少在理论上,如果给你一个 C# .cs 文件(或任何单个程序源代码文件),你应该能够查看代码并创建一个模拟它需要的一切的环境。通过一些编译/解析技术,您甚至可以创建一个工具来自动完成它。如果您至少记住了这一点,那么您可以确保您理解代码文件所说的所有内容。

现在考虑一下,如果给你一个 .cs 文件,其中包含 1000 个using指令,而实际上只使用了 10 个指令。每当您查看引用外部世界的代码中新引入的符号时,您都必须通过这 1000 行来弄清楚它是什么。这显然减慢了上述过程。因此,如果您可以将它们减少到 10 个,那将会有所帮助!

在我看来,C#using指令非常弱,因为你不能指定单个泛型符号而不会丢失泛型,并且你不能使用using别名指令来使用扩展方法。在 Java、Python 和 Haskell 等其他语言中情况并非如此,在这些语言中,您能够(几乎)准确地指定您想要从外部世界获得什么。但即便如此,我还是建议尽可能使用using别名。

于 2014-02-26T02:57:43.537 回答