c#中的命名空间

时间:2012-02-07 08:03:19

标签: c# .net

在以下示例中,哪一个是最佳用途。如您所见,我只使用列表集合而没有命名空间中的任何其他内容。是这样的,当执行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();
}

8 个答案:

答案 0 :(得分:5)

第一种情况让你在课堂开头宣布你打算在课堂上使用什么(你的偶合)。 IDE和编译器将声明和其他用途用于:

  • 启用intellisense(自动完成)
  • 激活扩展方法(例如Linq扩展方法)

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

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

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

答案 1 :(得分:1)

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

同样在名称冲突的情况下,您可以这样做:

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

答案 2 :(得分:1)

导入名称空间的using语句仅对编译器是必需的。它是一种捷径,因此您无需完全限定所使用的类型。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

AFAIK使用它们没有任何实际好处。第二个更加冗长,可能会使阅读代码变得更加困难。如果你必须在你的接口/类中多次引用List类型,我建议你包含相关的命名空间,以减少它的冗长。

在此之前已经讨论了几次:例如herehere

答案 6 :(得分:0)

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

否则,我更倾向于使用方法1来使用更清洁的产品。格式化的代码。

答案 7 :(得分:0)

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

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

(仅为订单 - 我建议您在Ex1中使用)

而且 - 不,当你使用Using时 - 并非所有的库都被加载了...加载了什么 - 只是,例如,你调用的List

好 - 好运!