【问题标题】:Why should you remove unnecessary C# using directives?为什么要使用指令删除不必要的 C#?
【发布时间】:2010-09-13 06:30:26
【问题描述】:

例如,我很少需要:

using System.Text;

但默认情况下它始终存在。如果您的代码包含不必要的using directives,我假设应用程序将使用更多内存。但是还有什么我应该注意的吗?

此外,如果相同的 using 指令仅用于一个文件与大多数/所有文件中,是否有任何区别?


编辑:请注意,此问题与称为using statement 的无关概念无关,旨在通过确保当对象超出范围时调用其IDisposable.Dispose 方法来帮助管理资源。见Uses of "using" in C#

【问题讨论】:

    标签: c# assemblies using


    【解决方案1】:

    除了编码偏好之外,几个原因可以删除未使用的 using(s)/命名空间:

    • 删除项目中未使用的 using 子句可以加快编译速度,因为编译器可以查找要解析的类型的名称空间更少。 (对于 C# 3.0 尤其如此,因为有扩展方法,编译器必须在所有命名空间中搜索扩展方法以寻找可能的更好匹配、泛型类型推断和涉及泛型类型的 lambda 表达式)
    • 当新类型被添加到与已用命名空间中的某些类型同名的未使用命名空间时,可能有助于避免未来构建中的名称冲突。
    • 将在编码时减少编辑器自动完成列表中的项目数,可能会导致更快的输入(在 C# 3.0 中,这也可以减少显示的扩展方法列表)

    删除未使用的命名空间不会做什么:

    • 以任何方式改变编译器的输出。
    • 以任何方式更改已编译程序的执行(更快的加载或更好的性能)。

    无论是否删除了未使用的 using,生成的程序集都是相同的。

    【讨论】:

    • 当你修改文件时,你最终会在文件的开头添加越来越多的命名空间。因此,如果您不删除未使用的命名空间,当您打开文件时,您所看到的只是一个巨大的命名空间列表,而不是实际的实现。
    • 关于更快的编译:.cs 文件中未使用的using 指令可能会阻止您从.csproj 项目中删除一些(否则未使用的)程序集引用。如果你有许多项目的“解决方案”,项目之间不必要的引用将迫使项目按特定顺序编译,而实际上它们是独立的并且可以并行编译。因此,在检查多项目解决方案中未使用的项目引用之前,请删除未使用的 using 指令。
    • 这是一个很好的解释 - 最后它与性能没有太大关系,而是与最佳实践有关。感谢您的解释!
    【解决方案2】:

    当你的程序运行时它不会改变任何东西。所需的一切都按需加载。因此,即使您有该 using 语句,除非您实际使用该命名空间/程序集中的类型,否则不会加载与 using 语句相关的程序集。

    主要是清理个人喜好。

    【讨论】:

    • 但它会影响编译时间和 Intellisense/IDE 响应能力。
    【解决方案3】:

    代码整洁很重要。

    当人们看到多余的使用时,人们会开始感觉到代码可能没有维护并且在浏览路径上。本质上,当我看到一些未使用的 using 语句时,我的脑后会升起一面小黄旗,告诉我“谨慎行事”。阅读生产代码永远不会给你那种感觉。

    所以清理你的使用。不要马虎。激发信心。让你的代码漂亮。给另一个开发者那种温暖模糊的感觉。

    【讨论】:

    • 现在这就是我想听到的 :-) 我习惯于时不时地做一个Organize Usings -> Remove and Sort。顺便说一句,对我来说,Organize Usings 中的上面两个选项毫无意义。我说的是 VS2013 顺便说一句。
    【解决方案4】:

    没有对应于using 的IL 构造。因此,using 语句不会增加您的应用程序内存,因为没有为其生成代码或数据。

    Using 在编译时仅用于将短类型名称解析为完全限定类型名称。因此,不必要的using 唯一的负面影响是稍微减慢编译时间并在编译期间占用更多内存。不过我不会担心这个。

    因此,您不需要 using 语句的唯一真正负面影响是智能感知,因为在您键入时完成的潜在匹配列表会增加。

    【讨论】:

      【解决方案5】:

      如果您将类称为命名空间中的(未使用的)类,则可能会发生名称冲突。对于 System.Text,如果定义一个名为“Encoder”的类,就会遇到问题。

      无论如何,这通常是一个小问题,并被编译器检测到。

      【讨论】:

        【解决方案6】:

        留下额外的using 指令很好。删除它们有一点价值,但没有多大价值。例如,它使我的 IntelliSense 完成列表更短,因此更易于导航。

        编译的程序集不受无关的using 指令的影响。

        有时我将它们放在#region 中,然后将其折叠;这使得查看文件更清晰。 IMO,这是#region 为数不多的好用法之一。

        【讨论】:

        • 它们可以在没有区域的情况下折叠
        • @abatishchev:是的,在 VS2010 中确实如此。
        • #region 的少数几个好的用途之一”,所以你的意思是使用 #region 在大多数方面都不好?
        • 是的,#region 是代码异味。它说你的班级发生了太多事情。
        【解决方案7】:

        如果您想保持代码干净,则应从文件中删除未使用的using 语句。当您在一个需要了解您的代码的协作团队中工作时,好处显而易见,认为您的所有代码都必须维护,更少的代码 = 更少的工作,好处是长期的。

        【讨论】:

          【解决方案8】:

          您的应用程序不会使用更多内存。编译器可以找到您在代码文件中使用的类。除了不干净之外,真的没有什么坏处。

          【讨论】:

            【解决方案9】:

            主要是个人喜好。我自己清理它们(ReSharper 可以很好地告诉我什么时候不需要 using 语句)。

            可以说它可能会减少编译时间,但以当今计算机和编译器的速度,它不会产生任何明显的影响。

            【讨论】:

              【解决方案10】:

              它们只是用作快捷方式。例如,您必须编写: System.Int32 每次如果你没有使用系统;在上面。

              删除未使用的只会让你的代码看起来更干净。

              【讨论】:

                【解决方案11】:

                using 语句只是让您无法限定您使用的类型。我个人喜欢清理它们。实际上,这取决于如何使用 loc 指标

                【讨论】:

                  【解决方案12】:

                  只有您实际使用的命名空间允许您将代码记录在案。

                  您可以通过任何搜索工具轻松找到代码的哪些部分相互调用。

                  如果您有未使用的命名空间,这在运行搜索时没有任何意义。

                  我现在正在清理命名空间,因为我经常被问到应用程序的哪些部分以一种或另一种方式访问​​相同的数据。

                  由于数据访问被命名空间分隔,我知道哪些部分正在以各种方式访问​​数据,例如直接通过数据库和间接通过网络服务。

                  我想不出一种更简单的方法来一次完成所有这些操作。

                  如果您只是希望您的代码成为一个黑匣子(对开发人员而言),那么没关系。但是,如果您需要随着时间的推移对其进行维护,那么它就像所有其他代码一样是有价值的文档。

                  【讨论】:

                    【解决方案13】:

                    “using”语句不会影响性能,因为它只是限定标识符名称的助手。因此,您不必输入 System.IO.Path.Combine(...),只需输入 Path.Combine(...) 使用 System.IO

                    【讨论】:

                      【解决方案14】:

                      不要忘记编译器在构建项目时会做很多工作来优化所有内容。在很多地方使用它,或者 1 不应该在编译后做不同的事情。

                      【讨论】:

                        猜你喜欢
                        • 2016-12-25
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-10-12
                        • 2011-10-17
                        • 2011-03-10
                        • 1970-01-01
                        • 2011-11-05
                        相关资源
                        最近更新 更多