程序集 VS 命名空间进阶篇

 

   进入主题之前先来了解一下,项目、解决方案、程序集、命名空间四个容易混淆的概念。

项目就是我们开发的一个软件。.NET下,项目有多种类型,如控制台、Windows应用程序、类库、Web应用程序等等。经过编译后,会生成.exe文件和.dll文件。 .exe文件有统一的主程序入口,可以被执行。而类库只是提供一些功能给其他项目调用。

解决方案当我们在VS中新建任何一种类型项目时,这个项目还属于一个解决方案。当我们的业务相对简单时,解决方案所发挥的作用并不是很大。但当我们开发复杂的软件时,需要多个模块组成。比如说开发中常用的三层架构,U层是一个简单的windows应用程序、BD层由多个类库组成。通过一个解决方案,我们就可以将其组合起来,完成我们的开发。

    形象地说,解决方案就是一个容器,在这个容器里,分成好多层,好多格,用来存放不同的项目。

程序集一个项目就是一个程序集。一个程序集可以体现为一个dll文件,或者exe文件。

命名空间:主要是为了避免一个项目中,可能会存在的相同对象名的冲突。


一、命名空间

实例:System.Text命名空间定义了一组执行字符串处理的类型,而System.IO命名空间定义了一组I/O操作的类型。下面构造一个System.IO。FileStream对象和一个System.Text。StringBuilder对象:

<span style="font-size:18px;">public sealed class Program{
   public static void Main(){
      System.IO.FileStream fs = new System.IO.FileStream(…);
      System.Text.StringBuilder sb = new System.Text.StringBuilder();
   }
}</span>

    显然,像这样写代码非常繁琐。应该有一种简单的方式来直接引用FileStream和StringBuilder类型,减少打字量。幸运的是,许多编译器都提供了某种机制来减少程序员的打字量。C#编译器通过using指令来提供这个机制。以下代码和前面的例子完全一致:

<span style="font-size:18px;"><span style="font-size:24px;">using System.IO;                        //附加“System.IO.”前缀
using System.Text;                     //附加“System.Text.”前缀
public sealed class Program{
   public static void Main(){
      FileStream fs = new FileStream(…);
      StringBuilder sb = new StringBuilder();
   }
}</span></span>

   对于编辑来说,命名空间仅仅是在类型名称前加了一些由点号隔开的符号而已.这使得一个类型的名称更长,从而也更具惟一性.如果两个相同的类在同一个命名空间则会冲突,如果不同的命名空间有相同的类型,也会产生二义性

   注意,C#的using指示符会指示编译器试着在类型名上添加不同的前缀,直到找到一个匹配为止,命名空间只是逻辑上,真正的类型在程序集里,当查找一个类型的定义时,编译器必须被告知到哪些程序集中进行查找,编译器将扫描它知道的所有程序集来查找类型的定义.一旦编译器找到了正确的程序,程序集信息和类型信息会被添加到生成托管模块的元数据中。

   重要提示:CLR不知道命名空间的任何事情。访问一个类型时,CLR需要知道类型的完整名称(这可能是一个相当长、包含句点符号的名称)以及该类型的定义具体在哪一个程序集中。这样一样,“运行时”才能加载正确的程序集,找到目标类型,并对其进行操作。

二、联系与区别


1、命名空间是类库的逻辑组织形式,程序集就是类库的物理组织形式。

2、一个程序集内可能有多个命名空间,一个命名空间可能存在于不同的程序集中

3、程序集是实现类型的文件,编译之后生成的。 

  命名空间是对类型的逻辑分组。 

4、c#编译器可能比较关心命名空间,应为它需要确定类的完整名称,然后交给CLR。 

 CLR只关心程序集,会通过类的完整名称加载对应的程序集。


三、总结


   通过在项目中使用分部类,发现可以通过分部类实现对这个类的扩充和完善。而使用分部类时我们会对命名空间进行修改,近而将类进行扩展;这就是我们说的一个命名空间可以存在于不同的程序集。通过项目去不断成长,努力去做,迎接ITOO2.0的到来。

 

你可能感兴趣的:(程序集 VS 命名空间进阶篇)