【问题标题】:Namespacing in c#c#中的命名空间
【发布时间】:2012-02-28 16:15:18
【问题描述】:

在下面的例子中,哪一个是最好的。如您所见,我仅使用列表集合,而没有使用命名空间中的其他任何内容。是这样的,当执行 Example1 时,命名空间 system.collections.generic 下的所有类都加载到内存中还是什么?两个示例的行为如何?

Example1:

using System.Collections.Generic;
public interface ICustomer
{
    List<Customer> GetAll();
}


Example2: 

public interface ICustomer
{
    System.Collections.Generic.List<Customer> GetAll();
}

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    两个示例的行为完全相同(请记住,它们都被编译为中间代码)。我更喜欢 1,但这与清晰度有关,而不是它的行为方式。

    【讨论】:

      【解决方案2】:

      它们是一样的;你不应该担心using 语句,因为它主要影响智能感知性能

      如果出现名称冲突,您也可以这样做:

      using Generic = System.Collections.Generic;
      public interface ICustomer
      {
          Generic.List<Customer> GetAll();
      }
      

      【讨论】:

      • 在我看来,这样做的唯一用途是当您有名称冲突并且不想为其中一个写出整个命名空间时。除此之外,它会使代码混乱并使其更难阅读。
      • 确实,现在您必须知道 Generic 代表 System.Collections.Generic。如果我看到这个,我认为 Generic.List 代表比 .net 库定制的东西。
      • 只是好奇为什么答案被否决了!如果有问题,请告诉我,我会删除答案!
      • @PoweRoy 那么如果发生名称冲突,您还能做什么?您应该使用 FQN 或别名。
      • @fardjad:名称冲突只发生在定制的东西上。所以我会给自定义的东西加上别名,剩下的就不用管了。 (注意 -1 不是我的)
      【解决方案3】:

      它的唯一区别是 Intellisense。在文件中包含更多 using 语句会增加 Intellisense 必须索引和显示的内容。我发现示例 2 的可读性的好处值得 Intellisense 所做的额外工作。

      除此之外,两个示例都以相同的方式编译为 CIL,并且对性能绝对没有任何影响。

      【讨论】:

      • 而且增加的工作量并不多。即使是我的上网本也没有 Intellisense 的问题。
      【解决方案4】:

      AFAIK 两者都没有真正的好处。第二个更冗长,可能会使阅读代码更加困难。如果您必须在接口/类中多次引用 List 类型,我建议您包含相关的命名空间以使其不那么冗长。

      这已经在 SO 上讨论过几次了:例如 herehere

      【讨论】:

        【解决方案5】:

        取决于使用情况。如果您有许多具有相同名称的类,例如有另一个类也称为List,第二种方法更好(更清晰)。

        否则,我更喜欢使用方法 1 来获得更清晰和格式化的代码。

        【讨论】:

          【解决方案6】:

          如果您认为需要在另一个函数中再创建一个列表 - 您应该使用 Example1,

          但如果这是此列表的唯一实例 - 它是 Ex1 还是 Ex2 并不重要。

          (只是为了订单 - 我会提供你在 Ex1 中使用)

          而且 - 不,当您使用 Using 时 - 并非所有库都已加载...加载的内容 - 只是,例如,您调用的 List

          祝你好运!

          【讨论】:

            【解决方案7】:

            只有编译器需要使用 using 语句来导入命名空间。它是一种快捷方式,因此您无需完全限定您正在使用的类型。

            我更喜欢导入所有命名空间,即使我在该命名空间中只使用一种类型。要删除不需要的命名空间,您可以使用 Visual Studio 的功能来组织命名空间。

            【讨论】:

              【解决方案8】:

              第一种情况让您在课程开始时声明您打算在课程中使用什么(您的耦合是什么)。 IDE 和编译器使用声明以及其他用途:

              • 启用智能感知(自动完成)
              • 激活扩展方法(例如 Linq 扩展方法)

              因此,如果不声明它们,您将失去此功能。 这种用途是优选的。它也提高了代码的可读性。 即使 Visual Studio 不强烈建议您保持使用干净(例如在基于 java 的环境中显示警告等),最好从上下文菜单中执行“删除未使用的导入”你的类文件。

              第二种情况允许您使用通过完全限定名称显式引用它的类型。 这种情况通常在名称冲突的情况下使用。

              最终,二进制编译后的代码是一样的,因为编译器会对其进行优化,但如果使用第一种方法,编译过程本身可能会更高效。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-12-23
                • 2010-09-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多