详解C#中的命名空间
詳解C#中的命名空間
- 命名空間
- namespace
- using
- using static
- 命名空間中的規則
- 名稱范圍
- 名稱隱藏
- 重復的命名空間
- 命名空間別名
- 命名空間別名限定符
命名空間
C#中使用namespace關鍵字定義命名空間,命名空間類似我們電腦文件資源管理器中的文件夾,可自由命名且具有層級,命名空間中的各個類就像文件夾中的文件,通過各種命名及劃分層級來分類存放
namespace
命名空間通過關鍵字namespace定義,使用"."或者{}包含來定義嵌套的命名空間,如下面兩段代碼在語義上是等價的:
namespace Outer.Middle.Inner {class Class1 { }class Class2 { } } namespace Outer {namespace Middle { namespace Inner{class Class1 { }class Class2 { }}} }如果類型沒有在任何命名空間中定義,則它存在于全局命名空間. 全局命名空間包含了頂層命名空間,如上例中的Outer命名空間
using
using指令用于導入命名空間,可以避免使用完全限定名稱來指代某種類型.以下例子導入了上述例子中的Outer.Middle.Inner命名空間:
using Outer.Middle.Inner;class Test{static void Main(){Class1 c1; //此處不需要一層層指定Class1的命名空間,因為已經通過using引入了}}using static
使用using static可以引用命名空間中的靜態成員,包括字段,屬性及嵌套類型.如下例中我們引用Console類的靜態成員后可直接調用WriteLine方法:
using static System.Console; WriteLine("Hello, World!");注意using static指令只能用于類型,不能用于命名空間(將產生一個編譯錯誤)
using static除了能導入靜態成員外還能導入枚舉類型:
命名空間中的規則
名稱范圍
外層命名空間中聲明的名稱能夠直接在內層命名空間中使用
namespace Outer {public class OuterClass { }namespace Middle { namespace Inner{class Class1:OuterClass { }}} }命名空間分層結構中不同分支中的類型需要使用部分限定名稱
namespace Outer {public class OuterClass { }namespace Middle { namespace Inner{class Class1:OuterClass { }}namespace Inner2{class Class2:Inner.Class1 { } //此處不能直接使用Class1}} }名稱隱藏
如果同一類型名稱同時出現在外層和內層命名空間中,則內層名稱優先.如果要使用外層類型,必須使用它的完全限定名稱:
namespace Outer {public class One { }namespace Inner{class One { }class Test{One inner;// = Outer.Inner.OneOuter.One outer; // =Outer.One}} }所有類型名稱在編譯時都會轉化為完全限定名稱.中間語言(IL)代碼不包含非限定名稱和部分限定名稱.
重復的命名空間
只要命名空間中的類型名稱不沖突就可以重復聲明同一個命名空間:
namespace Outer {class Class1 { } } namespace Outer {class Class2 { } }上述示例和在Outer命名空間中同時定義Class1和Class2語義上是一樣的,上面兩個類也可以分別定義在兩個不同的源文件,編譯到不同的程序集中去.
命名空間別名
導入命名空間可能會導致類型名稱的沖突,這時我們可以為導入的類型或者命名空間創建別名,如下:
using Assembly2 =System.Reflection.Assembly; //給命名空間中的指定類型創建別名 class Program {Assembly2 asm; //= System.Reflection.Assembly } using R = System.Reflection; //給整個命名空間創建別名 class Program {R.Assembly asm; //= System.Reflection.Assembly }命名空間別名限定符
之前提到,由于內層命名空間中的名稱優先級更高會隱藏外層命名空間中的名稱.有時即使使用類型的完全限定名稱也無法解決沖突,如下示例:
namespace N {class A{A.B b; //此處雖然使用完全限定名稱,但還是會拿到嵌套類B的實例,而不是A命名空間下的類Bclass B { }} } namespace A {class B { } }要解決這樣的沖突,可以使用全局命名空間global來限定命名空間中的名稱:
namespace N {class A{global::A.B b; //通過global限定全局命名空間下的A命名空間中的類Bclass B { }} } namespace A {class B { } }總結
以上是生活随笔為你收集整理的详解C#中的命名空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: element 表格+分页封装
- 下一篇: HTML高度塌陷