← 筆記

C#筆記 – 命名空間

命名空間和程序集
  •   using System.IO;
      using System.Text;
      
      public class Program
      {
          public static void Main()
         {
              FileStream fs = new FileStream(...);
              StringBuilder sb = new StringBuilder();
         }
      }
  • 命名空間對相關的類型進行邏輯分組,使開發者更方便定位類型

  • 對於編譯器,命名空間的作用就是為類型名稱附加以句點分隔的符號,使之更可能具有唯一性

    • 如上例中,編譯器將對FileStream的引用解析為System.IO.FileStream
  • 編譯器在編譯源代碼時,需要保證調用的方法和類型是確實存在的

    • 如果在源代碼文件或引用的程序集中找不到具有指定名稱的類型,就會嘗試在類型名稱前附加using指定的命名空間前綴。如果加上第一個(System.IO)後找不到,那就使用第二/三/…個代替並查找

    • 查找到對應的類型後,編譯器就會自動將引用展開成:System.IO.FileStream和System.Text.StringBuilder

  • 如果using的不同命名空間之間,有同名的類型,就需要在同名類型使用時,指出想使用的具體是哪個命名空間中的類型。

    •   namespace A
        {
            public class Hello{ }
        }
        namespace B
        {
            public class Hello{ }
        }
        ////////////////////////////////////
        using A;
        using B;
        public class Program
        {
            public static void Main()
            {
                A.Hello a_Hello = new A.Hello();
                B.Hello b_Hello = new B.Hello();
            }
        }
    • 另一種方法是為類型或命名空間創建別名

      • 限定的命名空間別名

        •   using WinForms = System.Windows.Forms //A
            
            class WinForms { } //B
                
            class Test
            {
                static void Main()
               {
                    Console.WriteLine(typeof(WinForms.Button)); //B
                    Console.WriteLine(typeof(WinForms::Button)); //A
               }
            }
      • 全局命名空間別名

        •   class Configuration {} //A
            namespace Chapter7
            {
                class Configuration { } //B
                
                class Test
                {
                    static void Main()
                    {
                        Console.WriteLine(typeof(Configuration)); //B
                        Console.WriteLine(typeof(global::Configuration)); //A
                    }
                }
            }
      • 外部別名

        •   extern alias TestAlias;
  • 如果命名空間名、類型名都一樣,就應用使用外部別名

  • 命名空間和程序集的關係

    • 兩者不一定相關

    • 同一namespace中的類型可在不同的程序集中實現,如System.IO.FileStream在MSCorLib.dll;System.IO.FileSystemWatcher在System.dll

    • 同一程序集可包含不同namespace的類型,如System.Int32和System.Text.StringBuilder都在MSCorLib.dll中

參考書目

  • 《CLR via C#》(第4版) Jeffrey Richter
  • 《深入理解C#》(第3版) Jon Skeet