C 命名空間詳解namespace

2021-09-07 20:43:00 字數 3383 閱讀 5673

命名空間是乙個域,這在個域中所有的型別名字必須是唯一的,不同的型別分組歸入到層次化的命名空間,

命名空間的好處是:1、避免名字衝突,2、便於查詢型別名字。

如:system.secruity.cryptogtaphy.

下面介紹namespace 關鍵字的使用。

namespace test

class class0

int i;

public class0()}}

}using關鍵字使用

,訪問乙個命名空間的內容可以通過完全限定名。如:test.class0來訪問。但是每次這樣在程式寫很麻煩。你可以使用using指令來引用型別。

命名空間的都是引用型別的。所以在程式的開頭你可以先引用命名空間。就像你使用vs編譯軟體時,每個系統生成的console中都有

using system;

using system.drawing;

using system.threading ;

之後就可以很方面使用你引用命名空間的型別了。注意using的使用,後面的還要對此做介紹。

全域性命名空間

全域性命名空間有兩部分組成:

1、所有的頂級命名空間;

2、所有沒有在任何命名空間中宣告的型別;

例如:前面的例子的全域性命名空間中宣告了test型別(屬於第一種情況。)

例如:class outer{}//屬於第二種情況;

namespace test1{}是全域性命名。

命名空間的規則

名字作用域

所有出現的外部命名空間中的名字都隱式地被引入到內部的命名空間中。在這個例子中middle 和class1被隱式的引入到inner中;

namespace outer

namespace middle

class class1{}

namespace inner

class class2:class1{}}}

}在這個例子中:如下:

namespace test

}namespace managerreporting

}可以看到乙個test命名空間中包含兩個不交的命名空間。要想引用另外乙個,必須使用部分限定名。你可以看出他和上面的例子的區別嗎?

名字遮蔽

內部命名空間的名字會遮蔽外部空間相同的名字。

例如;namespace outer

class class2{}

namespace inner

在這個例子中。在outer命名空間宣告了兩個命名空間,在inner命名空間中,cinner引用的是inner.class2的型別。couter引用的是middle.class2型別。乙個大括號表示程式執行結束時,釋放裡面的臨時變數。遮蔽功能僅僅是使用簡單的名字引用某個型別有影響。如果想引用middle命名空間的class2 的型別。你可以鄉引用couter一樣。用部分限定名或完全限定名。你必須知道遮蔽對於執行時語義並沒有什麼影響。(因為編譯器在解析命名空間規則時,總是將名字轉化為完全限定名。編譯後生成的il語言不會包括無限定的或部分限定名。

重複命名空間

可以重複的宣告乙個命名空間,只要命名空間的型別名字沒有衝突;

namespace outer.middle.inner

}namespace outer.middle.inner

個人認為可以想下函式的過載。

甚至可以把這個例子分成兩個原始檔這樣就可以將每乙個類編譯進不同的彙編**中;

原始檔#1

namespace outer.middle.inner }

原始檔#2

namespace outer.middle.inner

巢狀指令using

可以在乙個命名空間中巢狀using指令。這樣可using指令的作用域限定在命名空間的宣告中。

namespace n1

namespace n2

}//compile true;

namespace n3

}//compile error

注意說明下這樣的寫,在vs中是無法通過的,還記得前面說的嗎?要想引用層次中的型別,必須加上部分或者完全限定名嗎?

型別別名和命名空間

引入命名空間可能導致型別名衝突,與其說引入命名空間的全部,不如僅選擇要使用的型別引人,給每個要使用的乙個別名。

using p=system。reflection

class program

但是我們完全沒有必要這樣做。因為我們可以把它們變成全域性的引用。就鄉你開啟vs時,生成的console一樣。

高階命名空間特性

extern

外部命名空間允許相同的名字出現。只要包含的型別不同就可以。這種情況最容易發生在來自不同的檔案中。

庫#1:

namespace widgets

庫#2:

namespace widgets

程式:using widgets;

namespace test//compile errror;

這個程式不正確的,是因為widget是不確定的。

解決這個問題就是引用完全限定名。

或者使用extern alias w1;extern alias w2;

命名空間別名限定

前面提到,內層命名空間的名字會遮蔽外層命名空間的名字。然而。有時候即使使用完全限定型別也不能解決這個衝突。如下:

namespace n

static void main()

new a.b();}}

}namespace a

}這個在執行的是巢狀的b。注意在vs中同乙個檔案中不可包含同樣的命名空間和型別。但在不同檔案可能出現。

有兩種辦法解決可能出現的命名空間衝突問題:

1、使用上面講的使用別名進行。

2、global命名空間----所有的命名空間的根。

namespace test

}別名限定:

external alias  w1;

external  alias w2;

namespace test{

static void main()

w1.widgets.widget w1=new w1.widgets.widget();

w2.widgets.widget  w2=new w2.widgets.widget();

namespace 的內容就講完了,如有什麼錯誤還請指正。

from: 

C 的記憶體模型以及命名空間 namespace

1.儲存連續性 在c 中使用四種不同的方案來儲存資料 2.靜態成員變數的記憶體分配 如果乙個類中有靜態成員 static 注意,不能在類的宣告中初始化靜態成員,這是因為宣告只是描述了如何分配記憶體,而並沒有分配記憶體,所以,對於靜態成員的初始化,需要在類的宣告之外進行 所以,靜態成員在類的宣告中宣告...

深入剖析js命名空間函式namespace

生成命名空間的方法繫結到jquery上 阿里員工寫的開源資料庫連線池的druid的源 時,發現了其中在jquery的原 中又定義了乙個命名空間的函式 namespace 其 如下 namespace druid.index druid.index function submit function 使...

命名空間詳解(c )

假設我班有倆個同學,一男一女都叫eric,但是如果他倆同時在我面前我只叫eric的話,他倆會不知道我在叫他倆哪位?同樣的,我們將這種現象放在 中。程式設計師對物件命名的時候,一般都會起一些有意義的名稱。在一段 中會現很多的實體,這些實體可能擁有不同的功能,但是他們有同樣的名稱。但是,c 中採用的是單...