在C#中使用命名空间

时间:2011-05-06 17:41:47

标签: c# namespaces

我想知道,C#和其他编程语言中命名空间的目的是什么......

据我所知,它们用于两件事:

  • 将项目构建为有意义的部分
  • 区分具有相同名称的班级

我的问题是:使用命名空间时还有其他需要考虑的事项吗?它们会对性能有什么影响吗?

6 个答案:

答案 0 :(得分:43)

  

据我所知,它们用于两件事:

     

•将项目构建为有意义的部分

     

•区分具有相同名称的类

基本上就是这样。我想补充一点,命名空间提供的结构大于项目的结构,因为命名空间可能跨越项目和程序集。我想补充一点,命名空间的主要目的是为库添加结构,以便更容易找到所需的东西并避免不需要的东西 。也就是说,名称空间对于库的用户来说是方便的,而不是为了方便其创建者。

secondary 目的是消除名称冲突的歧义。名称冲突在实践中非常罕见。 (如果命名空间的主要目的是消除冲突的歧义,那么可以想象基类库中的命名空间会少得多!)

  

使用命名空间时还有其他需要考虑的事项吗?

是。纠正命名空间的使用有很多方面。例如:

  • 违反标准命名约定会导致混淆。特别是,不要将类命名为与其名称空间相同的名称! (有关详细信息,请参阅以下链接。)
  • 使用命名空间可以使扩展方法发挥作用,而你却没有想到;小心
  • 精确地使用“using”指令可以在名称冲突的世界中巧妙地改变分辨率规则;这些情况很少见,但出现时会感到困惑
  • 冲突经常出现在机器生成的代码与人类生成的代码交互的环境中;在这种情况下要小心,特别是如果你是编写代码生成器的人。要非常防守;你不知道写人类生成的一半人会创造什么样的疯狂名字碰撞。

有关详细信息,请参阅我关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/tags/namespaces/

另请参阅框架设计指南,以了解有关命名空间使用的正确和错误约定的更多想法。

  

它们会对性能产生影响吗?

几乎没有。命名空间是C#语言的虚构;底层类型系统没有“名称空间”。当你说

using System;
...
class MyException : Exception 
...

没有名为“Exception”的类。类名是“System.Exception” - 名称中有一个句点。 CLR,反射和C#语言都让你相信这个类被命名为“Exception”并且它位于名称空间“System”中,但是一旦你进入幕后,真的没有这样的野兽作为命名空间。这只是一个惯例,你有时可以省略“系统”。来自名称“System.Exception”。

答案 1 :(得分:2)

根据MSDN,命名空间具有以下属性:

  • 他们组织大型代码项目。
  • 他们与。分开。操作者。
  • using指令意味着您不需要为每个类指定命名空间的名称。
  • 全局命名空间是»root«命名空间:global::System将始终引用.NET Framework命名空间System

其次,命名空间与性能无关,但如果您已创建自己的命名空间,则应遵循项目中的约定。

答案 2 :(得分:2)

它不会影响性能。但是为了代码可读性,我建议删除不需要的使用语句

答案 3 :(得分:2)

命名空间是从早期技术(如XML)中提取的概念。命名空间为您的类提供上下文,允许您在域和数据代码中说出一个CUstomer对象。

您也可以使用命名空间来进行别名,但仍然可以使用命名空间,但允许更短的命名特定对象。

domain.customer 与 data.customer

答案 4 :(得分:1)

你已经提到了两个主要原因。这是来自MSDN的旧文章,但它仍然适用:Namespace Naming Guidelines

在Java世界中,命名做法是撤销拥有该产品的公司的域名,并在此之后包含该产品的名称。所以com.example.product可能是一个有效的命名空间,但你在.NET中并没有真正看到它。

答案 5 :(得分:0)

那些是那些大的。

没有真正的性能优势。至少,不是直接的。没有命名空间框架将不得不搜索更多的地方来找到你想要包含的代码 - 这几乎就像需要为每个项目加载整个.NET框架。嗯,不是真的,但它足够接近这个讨论。