在C#中使用命名空间

Syj*_*jin 20 c# namespaces

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

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

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

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

Eri*_*ert 44

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

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

•区分具有相同名称的类

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

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

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

是.有许多方面可以纠正名称空间的使用.例如:

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

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

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

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

它们对性能或类似的影响有影响吗?

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

using System;
...
class MyException : Exception 
...
Run Code Online (Sandbox Code Playgroud)

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

  • @joey @eric命名空间是名称的一部分,因此它们是程序集的一部分,因此它们是加载的东西的一部分.命名空间使字符串更长,因此它们使文件更大,因此加载时间更长,占用更多内存.我愿意说Namespace会对性能产生影响,但我也愿意说影响是如此微小和微不足道,以至于没有性能影响.如果您要测量名称空间的影响,您可能希望停止使用.net并在直接汇编中重写代码:-) (5认同)
  • 这让我现在想知道为什么会有一个"差不多",几乎从未对性能产生影响.有案例吗? (2认同)