C# 命名空間和程序集


一、命名空間

1、通過使用using關鍵字引入命名空間,減少代碼量

命名空間對相關的類型進行邏輯分組,通過命名空間能快速的定位到相關的類型,例如:在System.IO命名空間下,定義了所有I/O操作的類型,當我們需要使用相關的I/O操作的類型時,就可以引入該命名空間。代碼如下:

public sealed class Program
{
     public static void Main()
     {
          System.IO.FileStream fs=new System.IO.FileStream(...);
     }
}       

上面的代碼構造了一個System.IO.FileStream對象,像這樣寫代碼很繁瑣,因為每次都需要寫上類型的完全限定名,所以C#編譯器提供了using指令,通過using指令導入類型的命名空間,從而避免全面限定名的方式使用類型,代碼如下:

using  System.IO;
public sealed class Program
{
     public static void Main()
     {
          FileStream fs=new FileStream(...);
     }
}       

原理:編譯器在編譯的時候,會在類型的前面加上命名空間,比如當我們使用FileStream類的時候,編譯器會將FileStream類的引用解析為System.IO.FileStream.

在上面的示例代碼中,編譯器需要保證引用的每個類型都真實存在,而且代碼以正確的方式使用類型一也就是調用確實存在的方法,向方法傳遞正確數量的實參,保證方法具有正確類型,正確使用方法返回值等。如果編譯器在源代碼文件或者引用的程序集中找不到指定的類型,就會在類型前面加上System.IO前綴,如果找不到匹配項,就逐一地在類型前面加上通過using引入的命名空間,知道找到指定的類型,否則編譯就會報錯,所以通過using引入命名空間的方式,能極大程度的幫助我們減少代碼量.還增強了代碼的可讀性.

 

2、編譯器查找類型的原理

編譯器掃描引用的所有的程序集,在其中查找類型定義,一旦找到了正確的程序集,程序集信息和類型信息就被嵌入到托管模塊中的元數據中.為了獲取程序集信息必須將定義了被引用程序的信息傳遞給編譯器.C#編譯器自動在MSCorLib.dll程序集中查找被引用類型,即使沒有顯示告訴它這么做.MSCorLib.dll程序集中包含所有核心Framework(FCL類型)的定義.

 

3、編譯器對待命名空間的方式存在潛在的問題:可能兩個或者多個類型在不同的命名空間中同名,微軟建議開發人員為類型定義具有唯一性的名字,但是“運行時”鼓勵組件重用。例如:

應用程序可能同時使用了Microsoft和Wintellect開發的組件,假如兩家公司都提供名為Widget類型,兩個類型做的事情完全不同,由於干涉不了類型名稱。所以當你引入Microsoft和Wintellect命名空間,並使用Widget類型時,編譯器就會報CS0104:"Widget"是"Microsoft.Widget"和"Wintellect.Widget"之間不明確的引用的錯.

所以必須使用一些方法來解決這個問題,以下是解決方案:

(1)、使用完全限定名稱來區分並使用它們,代碼如下:

Microsoft.Widget mw=new Microsoft.Widget();
Wintellect.Widget ww=new Wintellect.Widget();

(2)、C# using指令的另一種形式為類型或者命名空間創建別名,如果只想使用命名空間中的少量類型,不想它的所有類型都跑出來"污染"全局命名空間,別民就顯得十分方便,代碼如下:

using WintellectWidget=Wintellect.Widget;
WintellectWidget w=new WintellectWidget();

(3)、外部別名方式

自行百度

 

4、關於命名空間的一些建議

參考微軟的命名方式,使用公司名稱作為頂級名稱,以減少發生沖突

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM