在C#中使用命名空间

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

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

  • 将项目构建成有意义的部分
  • 区分具有相同名称的类

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

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

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

•区分具有相同名称的类

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

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

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

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

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

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

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

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

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

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

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

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

你已经触及了两个主要原因。 这是来自MSDN的旧文章,但它仍然适用: 命名空间命名准则

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

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

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

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

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

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

您还可以使用命名空间来进行别名,这仍然可以执行上述操作,但允许对特定对象进行更短的命名。

domain.customer与data.customer

那些是那些大的。

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