若是说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。只有同时指定类型所在的命名空间及实现该类型的程序集,才能彻底限定该类型。《精通.NET核心技术--原理与架构》 程序集和命名空间不存在必然联系,一个程序集能够包含多个命名空间,同一个命名空间也能够分放在几个程序集。html
程序集是应用程序的部署单元。.NET应用程序包含一个或多个程序集。一般扩展名是EXE或DLL 的.NET可执行程序称为程序集。.NET程序集包含元数据,这些元数据描述了程序集中定义的全部类型及其成员的信息,即方法、属性、事件和字段。程序员
在使用共享程序集时,几个应用程序都使用同一个程序集,且与它有必定的依赖关系。共享程序集减小了磁盘和内存空间的需求。使用共享程序集时,要遵循许多规则。共享程序集必须有一个版本号和一个惟一的名称,一般它安装在全局程序集缓存(globd assembly cache,GAC,中。GAC容许共享系统上同一个程序集的不一样版本。数据库
在一个程序集中能够有不一样的名称空间,同一个名称空间也能够分布在多个程序集上。名称空间只是类型名的一种扩展,它属于类型名的范畴。浏览器
还能够这样理解:命名空间就是一个程序集内相关类型的一个分组。举例来说,System.IO命名空间包含了有关文件I/O的类型,System.Data命名空间定义了基本的数据库类型,等等。须要特别指出的是,一个程序集(好比mscorlib.dll)能够包含任意个命名空间,每一个命名空间又能够包含多种类型。缓存
更好的理解程序集和命名空间的关系,能够打开VS里的对象浏览器,能够看到大量的程序集,程序集里又包含了不少不一样名的命名空间,同时能够看到一个现象:不一样的程序集又包含了同名的命名空间。 架构
===========================================post
命名空间与装配件的关系
不少人对这个概念可能仍是很不清晰,对于合格的.Net程序员,有必要对这点进行澄清。 装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。
装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面能够有多个命名空间,一个命名空间也能够在多个装配件中存在,这样说可能有点模糊,举个例子:url
装配件A:
namespace N1
{
public class AC1 {…}
public class AC2 {…}
}
namespace N2
{
public class AC3 {…}
public class AC4 {…}
}spa
装配件B:htm
namespace N1
{
public class BC1 {…}
public class BC2 {…}
}
namespace N2
{
public class BC3 {…}
public class BC4 {…}
}
这两个装配件中都有N1和N2两个命名空间,并且各声明了两个类,这样是彻底能够的,而后咱们在一个应用程序中引用装配件A,那么在这个应用程序中,咱们能看到N1下面的类为AC1和AC2,N2下面的类为AC3和AC4。
接着咱们去掉对A的引用,加上对B的引用,那么咱们在这个应用程序下能看到的N1下面的类变成了BC1和BC2,N2下面也同样。
若是咱们同时引用这两个装配件,那么N1下面咱们就能看到四个类:AC一、AC二、BC1和BC2。
到这里,咱们能够清楚一个概念了,命名空间只是说明一个类型是那个族的,好比有人是汉族、有人是回族;而装配件代表一个类型住在哪里,好比有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。