作为一个.NET程序员有必要对命名空间和程序集有明确的认识,下文很好解释了这两者的关系,感谢作者!

本文转自:http://www.cnblogs.com/netlyf/archive/2009/09/17/1568389.html      原作者:NetLYF

如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型。《精通.NET核心技术--原理与架构》 程序集和命名空间不存在必然联系,一个程序集可以包含多个命名空间,同一个命名空间也可以分放在几个程序集。

程序集是应用程序的部署单元。.NET应用程序包含一个或多个程序集。通常扩展名是EXE或DLL 的.NET可执行程序称为程序集。.NET程序集包含元数据,这些元数据描述了程序集中定义的所有类型及其成员的信息,即方法、属性、事件和字段。

在使用共享程序集时,几个应用程序都使用同一个程序集,且与它有一定的依赖关系。共享程序集减少了磁盘和内存空间的需求。使用共享程序集时,要遵循许多规则。共享程序集必须有一个版本号和一个唯一的名称,通常它安装在全局程序集缓存(globd assembly cache,GAC,中。GAC允许共享系统上同一个程序集的不同版本。

在一个程序集中可以有不同的名称空间,同一个名称空间也可以分布在多个程序集上。名称空间只是类型名的一种扩展,它属于类型名的范畴。

还可以这样理解:命名空间就是一个程序集内相关类型的一个分组。举例来讲,System.IO命名空间包含了有关文件I/O的类型,System.Data命名空间定义了基本的数据库类型,等等。需要特别指出的是,一个程序集(比如mscorlib.dll)可以包含任意个命名空间,每个命名空间又可以包含多种类型。

更好的理解程序集和命名空间的关系,可以打开VS里的对象浏览器,可以看到大量的程序集,程序集里又包含了很多不同名的命名空间,同时可以看到一个现象:不同的程序集又包含了同名的命名空间。  

===========================================

命名空间与装配件的关系
很多人对这个概念可能还是很不清晰,对于合格的.Net程序员,有必要对这点进行澄清。 装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。       
装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在,这样说可能有点模糊,举个例子:

装配件A:
namespace  N1
{
      public  class  AC1  {…}
      public  class  AC2  {…}
}
namespace  N2
{
      public  class  AC3  {…}
      public  class  AC4  {…}
}

装配件B:

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下面我们就能看到四个类:AC1、AC2、BC1和BC2。

到这里,我们可以清楚一个概念了,命名空间只是说明一个类型是那个族的,比如有人是汉族、有人是回族;而装配件表明一个类型住在哪里,比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。

命名空间和程序集的关系:
1.
从属于一个命名空间的各个类型可能在不同的程序集中实现。例如:system.IO.FileStream类型是在MSCorlib.dll 程序集中实现的,而System.IO.FileSystemWatcher类型是在System.dll 程序集中实现的。事实上, .Net framework 甚至根本没有发布一个System.IO.dll程序集。(一个程序集内可能有多个命名空间,同一个命名空间可能存在于不同的程序集中.)
2. 在一个程序集中,也可能包含不同命名空间中的类型。例如,System.Int32和System.Text.StringBuilder类型都在MSCorLib.dll程序集中。
3. 在.net framework SDk文档中查找一个类型时,文档会明确的指出类型所属的命名空间,以及实现了该类型的程序集。
(用一个形象的比喻:一个类型,它有两个身份证,一个是命名空间,一个是程序集)

转载于:https://www.cnblogs.com/kevinWu7/p/10163545.html

C#中的程序集和命名空间相关推荐

  1. DSQ无法安装2012版SQL登录失败怎么办?操作“检查系统重新引导是否处于挂起状态”“注册数据质量程序集和存储过程”已完成,但有错误,正在中止安装

    2012版SQL Server无法正常登录怎么办 操作"检查系统重新引导是否处于挂起状态"已完成,但有错误,正在中止安装 操作"注册数据质量程序集和存储过程"已 ...

  2. C#中Winform程序中如何实现多维表头【不通过第三方报表程序】

    问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...

  3. android中存放程序资源,Android 工程中存放各种程序资源的目录是()

    摘要: 工各种模型按照空间框架.片厚的垫度_要求两侧,资源轴承间隙垫片调整利用时.工各种Z系定位产品列的是(.... 工各种模型按照空间框架. 的要的求是错误,程中存放程序隙时轴承的轴采用承间压铅量主 ...

  4. EXE文件中的程序的加载过程 SA是什么呢?PSP是什么?

    精华解读:https://zhidao.baidu.com/question/195901151.html 段地址SA,默认在DS中! 查看PSP命令: -d ds:0 一般来说,PSP是256个字节 ...

  5. 在同一个文件中定义多个命名空间

    (PHP 5 >= 5.3.0, PHP 7) 也可以在同一个文件中定义多个命名空间.在同一个文件中定义多个命名空间有两种语法形式. Example #1 定义多个命名空间,简单组合语法 < ...

  6. [跟我学UML] UML包图中的包和命名空间

    本文基于UML规范,介绍了包图中的包和命名空间.此外,通过举例来帮助读者加深理解. ...请打开附件阅读全文. 转载于:https://blog.51cto.com/yunli/186628

  7. 中美程序员的不完全对比,看看跟你了解的一样吗?

    大家好,我是DD. 你平时有想过这个问题吗?为什么一些在国外流行的技术和框架,在国内就很少被认可呢?是技术的原因还是人的原因呢? 今天刚好在知乎上看到一篇国内外程序员区别对比的文章,原文作者是知乎的一 ...

  8. 未能在全局命名空间中找到类型或命名空间名称“Wuqi”

    下载了AspNetPager控件用以进行分页操作,在项目中放入控件后,运行报错:未能在全局命名空间中找到类型或命名空间名称"Wuqi" . 解决办法:在项目下拉框"引用& ...

  9. stm32f4 RAM中运行程序 读保护设置

    主要是为了在RAM中运行程序来解除读保护的.没想到ST-Link Utility 就直接可以. ST-Link Utility:target-->options bytes-->就可以看到 ...

最新文章

  1. 一文看懂最近70年的人工智能简史!中国已经领先全球!
  2. Batch Normalization的作用及原理
  3. python服务端对应多个客户端_Python-网络编程:TCP2 循环为多个客户端服务
  4. Jensen不等式及其证明
  5. html5画布funcition,2020前端基础知识学习第一节(示例代码)
  6. Spring-AOP概念及使用教程
  7. encoding/json 方法Marshal的说明
  8. Gtk与Cuda混合编程
  9. java匿名对象_面向对象
  10. python综合实验报告_Python程序设计实验报告五:综合运用三种基本结构进行程序设计(综合性实验)...
  11. 苹果Mac全新的文件启动方式:Hapigo
  12. 【批处理命令】call命令
  13. 【电路仿真】基于matlab Simulink红绿灯车辆数量识别【含Matlab源码 378期】
  14. 朱松纯:三读《赤壁赋》,并从人工智能的角度解读“心”与“理”的平衡
  15. windows自带黑体_win10字体设置黑体|win10系统文字如何设置黑体字体
  16. 单例模式几种实现方式和代码
  17. lpt监控安装_lpt1(如何在lpt1端口安装打印机)
  18. 《高效能青少年的七个习惯》读后感作文3900字
  19. java币值转换_币值转换
  20. 转:宁愿在真实前颤抖,也不愿在催泪弹下哭泣(今何在)

热门文章

  1. linux查看虚拟化版本,4.15. 虚拟化 (机器翻译版本)
  2. SpringBoot项目启动时控制台乱码,怎么办?
  3. MyBlog前端开发2
  4. CKEditor快速介绍与入门示例
  5. C语言调用自定义交换函,C语言函数篇 - personal page of Msingwen - OSCHINA - 中文开源技术交流社区...
  6. dbexception.java,mysql – org.h2.jdbc.JdbcSQLException:找不到列“ID”
  7. MyBatis3源码解析(6)TypeHandler使用
  8. python elementtree 命名空间_用Python中的命名空间通过‘ElementTree’解析XML
  9. python 简单检索器_python实现文件搜索工具(简易版)
  10. header manipulation 漏洞_【资讯】HPE 修补了两个关键的远程可利用漏洞