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