我想知道,C#和其他编程语言中命名空间的目的是什么......
据我所知,它们用于两件事:
我的问题是:使用命名空间时还有其他需要考虑的事项吗?它们会对性能有什么影响吗?
答案 0 :(得分:43)
据我所知,它们用于两件事:
•将项目构建为有意义的部分
•区分具有相同名称的类
基本上就是这样。我想补充一点,命名空间提供的结构大于项目的结构,因为命名空间可能跨越项目和程序集。我想补充一点,命名空间的主要目的是为库添加结构,以便更容易找到所需的东西并避免不需要的东西 。也就是说,名称空间对于库的用户来说是方便的,而不是为了方便其创建者。
secondary 目的是消除名称冲突的歧义。名称冲突在实践中非常罕见。 (如果命名空间的主要目的是消除冲突的歧义,那么可以想象基类库中的命名空间会少得多!)
使用命名空间时还有其他需要考虑的事项吗?
是。纠正命名空间的使用有很多方面。例如:
有关详细信息,请参阅我关于此主题的文章:
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,命名空间具有以下属性:
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框架。嗯,不是真的,但它足够接近这个讨论。