c#中名称空间的使用

本文关键字:空间 | 更新日期: 2023-09-27 17:55:04

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

据我所知,它们有两种用法:

  • 将项目组织成有意义的部分
  • 区分相同名称的类

我的问题是:在使用名称空间时,还有其他需要考虑的事情吗?它们对表现有影响吗?

c#中名称空间的使用

据我所知,它们有两种用法:

•将项目组织成有意义的部分

•区分同名的类

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

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

在使用名称空间时还有其他需要考虑的事情吗?

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

  • 违反标准命名约定可能会导致混淆。特别是,不要将类命名为与其命名空间相同的名称!(详情见下面的链接)
  • 使用命名空间可以使扩展方法发挥作用,你没有预料到的;小心
  • 中"using"指令的精确位置可以微妙地改变存在名称冲突的世界中的解析规则;这些情况很少见,但当它们出现时令人困惑
  • 冲突通常发生在机器生成代码与人类生成代码交互的环境中;在这种情况下要小心,特别是如果您是编写代码生成器的人。很有戒心;你不知道写人工生成的那一半的人会创造出多么疯狂的名字冲突。

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

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

关于名称空间使用的正确和错误约定的更多想法,请参阅框架设计指南。

它们对性能有影响吗?

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

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

没有名为"Exception"的类。类名是"System"。异常"——名称中有一个句号。CLR、反射和c#语言共同使您相信类被命名为"Exception",并且它位于名称空间"System"中,但是一旦您进入幕后,实际上没有名称空间这样的野兽。这只是一种惯例,您有时可以从名称"System. exception"中省略"System."。

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

  • 组织大型代码项目。
  • 用。分隔。操作符。
  • using指令意味着你不需要为每个类指定命名空间的名称。
  • 全局命名空间是"根"命名空间:global::System将始终引用。net框架命名空间System

其次,命名空间与性能无关,但如果您创建了自己的命名空间,那么您应该在整个项目中遵循约定。

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

名称空间是来自早期技术的概念,比如XML。名称空间为您的类提供上下文,允许您在域和数据代码中拥有一个CUstomer对象。

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

domain.customer与数据。customer

您已经谈到了两个主要原因。这是一篇来自MSDN的旧文章,但它仍然适用:

在Java世界中,命名实践是将拥有产品的公司的域名反转,并在后面包含产品名称。com.example。product可能是一个有效的名称空间,但在。net中并不常见。

这些是大的。

没有真正的性能优势。至少,不是直接的。如果没有名称空间,框架将不得不搜索更多的地方来找到你想要包含的代码——这几乎就像需要为每个项目加载整个。net框架一样。好吧,不完全是,但它已经足够接近这个讨论了。