未能找到类型或命名空间名称_命名空间详解
生活随笔
收集整理的這篇文章主要介紹了
未能找到类型或命名空间名称_命名空间详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
命名空間與類型有些相似,在類型中可以聲明諸多成員:字段,屬性,方法而在命名空間中可以聲明:類,接口命名空間屬于邏輯組合,用來對類型的功能進行邏輯分組成員根據相關性可以將name, age, sex成員定義到Person類型中類型可以把Dog, Cat類型定義到名為Animal的命名空間里聲明命名空間的結構namespace 名字 { }命名空間不能有修飾符如訪問修飾符//錯誤,不能使用修飾符private namespace 名字 { }聲明Animal命名空間namespace?Animal?{ }*命名空間的命名規則可參考變量名(可查看往期文章變量和常量)命名空間中不能包含成員: 字段,屬性,方法namespace Animal{ private int id; //錯誤 public int Id { get; set; } //錯誤 private void Test() { } //錯誤}類型名必須唯一,同一個命名空間中無法定義同樣的類型namespace Animal{ //正確????class?Dog?{ }???? //錯誤,命名空間 Animal中已經包含了Dog的定義????class?Dog?{ }}如果未給類型顯示提供命名空間,該類型將會被編譯器默認放到一個沒有名稱的全局命名空間(global namespace)中//正確class?Dog?{ }//錯誤,命名空間 global namespace中已經包含了Dog的定義class?Dog?{ }就像類型中無法定義多個相同名稱的成員一樣,類型名也需要具有唯一性命名空間的另一個作用便是提高類型名的唯一性,無法在同一個名稱空間下定義相同的類型,本質原因也是類型名需唯一所以可以寫出下面的代碼//正確class?Dog?{?}namespace Animal{ //正確,屬于不同命名空間????class?Dog?{ }}原因: 兩個Dog類型分屬不同的名稱空間,屬于全局命名空間的Dog類型名:Dog,屬于Animal命名空間的Dog類型名: Animal.Dog訪問不同命名空間中的類型(全局命名空間類型除外)需要使用類型限定名,同一個命名空間下則不需要namespace Animal{ class Dog { void Test() { //正確 Dog dog = new Dog(); } }}namespace A{ class Person { void Test() { //錯誤,未找到類型名 Dog dog = new Dog(); //正確 Animal.Dog dog = new Animal.Dog(); } }}但是這樣的代碼過于繁瑣,同時也降低了代碼的可讀性可以使用using指令簡化代碼using Animal;namespace Animal{????class?Dog?{ }}namespace A{ class Person { void Test() { //正確 Animal.Dog dog = new Animal.Dog(); //正確 Dog dog = new Dog(); } }}using指令注意事項namespace A{ //正確 using Animal;????class?Person?{ }}//錯誤用法namespace A{????class?Person?{ } //錯誤,using指令必須在命名空間中定義的所有其它元素之前 using Animal;????class?Person?{ }}思考: 為什么以下代碼會報錯呢class?Dog?{ }//錯誤using Animal;namespace?Animal?{ }由于未顯示指定命名空間的類型默認添加到全局沒有名字的命名空間中所以上述代碼相當于//global只是舉例namespace global{????class?Dog?{ }???? //錯誤,using指令必須在命名空間中定義的所有其它元素之前 using Animal;????namespace?Animal?{ }}*這便是為什么所有using都需要寫在最前面的原因了可以定義同名的命名空間namespace Animal{????class?Dog?{ }}namespace Animal{????class?Cat?{ }}相當于是這樣的namespace Animal{????class?Dog?{?}????class?Cat?{ }}命名空間可以嵌套namespace A{ namespace B { namespace C { } }}也可以從外到內依次遞進,使用句點分隔每個命名空間名稱的方式改寫簡化代碼namespace?A.B.C?{ }
不明確的引用
如果不同的命名空間中定義了相同的類型,這時在使用該類型的時候便會出現歧義,編譯器報錯"類型"是不明確的引用
namespace A{ //命名空間A定義Bird類型 class Bird { }}namespace B{ //命名空間B定義Bird類型 class Bird { }}//只添加using A或者using B是正確的namespace C{ using A; class Person { void Test() { //正確 Bird bird = new Bird(); } }}同時使用兩個命名空間下的相同類型名便會出現歧義//若需要同時使用兩個類型namespace C{ using A; using B; class Person { void Test() { //錯誤Bird 是A.Bird 和B.Bird 之間不明確的引用 Bird bird = new Bird(); } }}消除歧義性方法使用類型的完全限定名A.Bird birdA = new A.Bird();//正確B.Bird birdB = new B.Bird();//正確創建類型別名namespace C{ //為A.Bird定義別名為BirdA using BirdA = A.Bird; //為B.Bird定義別名為BirdB using BirdB = B.Bird; class Person { void Test() { BirdA birdA = new BirdA(); //相當于A.Bird birdA = new A.Bird() BirdB birdB = new BirdB(); //相當于B.Bird birdB = new B.Bird() } }}創建命名空間別名namespace A.B.C{????class?Bird????{????????public?string?Name?{?get; set; }????}}namespace D.E.F{ class Bird { public string Name { get; set; } }}namespace C{ //命名空間別名 using A = A.B.C; using D = D.E.F; class Person { void Test() { A::Bird birdA = new A::Bird() { Name = "一只黑色的鳥" }; D::Bird birdD = new D::Bird() { Name = "一只白色的鳥" }; } }}最后一點建議: 雖然可以通過創建類型別名或命名空間別名的方式消除歧義性,但還是建議定義類型時使類型名稱唯一知識小結- namespace關鍵字聲明
- 屬于邏輯組合,對類型進行邏輯分組
- 命名空間中不能包含成員: 字段, 屬性等
- 不能使用修飾符聲明命名空間
- 命名空間可以嵌套
- 類型限定名: 命名空間名.類型名
- 定義類型時最好使類型名唯一, 避免歧義
- using指令必須在命名空間中定義的所有其它元素之前
- 未顯示指定命名空間的類型會默認添加到沒有名字的全局命名空間
- 出現歧義性可以通過類型限定名, 創建類型別名和創建命名空間別名方法消除
相關閱讀
變量和常量
函數參數
索引器
關注公眾號【小F編程】,每天進步一點點,bug就會少一點~總結
以上是生活随笔為你收集整理的未能找到类型或命名空间名称_命名空间详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机里XPL是什么_单片机可以替代PL
- 下一篇: ppi 各代iphone_算算你的手机