1. 程式人生 > >如何理解“名稱空間”?

如何理解“名稱空間”?

名稱空間是為了解決相同作用域下的命名問題。

在C、C++、C#等語言中,都有名稱空間的概念,這是為了防止不同人編寫類庫發生命名衝突而設計的,名稱空間可以使變數、函式名稱、類名稱作用在本空間內,而其他空間可以使用同樣的名稱。就好比不同的資料夾下可以有相同的檔名一樣,但在相同的資料夾下不能有重複的檔名,名稱空間就好比這個虛擬的資料夾。

C語言的名稱空間。C語言也有這一概念,只是命名可將可自定義的範圍很小。在C語言的語法規則內,固定劃分了多個名稱空間,主要包括:
1、所有標籤組成一個空間,比如goto語句後面跟的標籤,不能重名
2、所有結構體、聯合體內部構成各自獨立的名稱空間,比如,A結構體和B結構體內的成員變數可以重名,但同一個結構體內不允許重名
3、所有結構體、聯合體、列舉型別的名稱構成同一個名稱空間,不能重名,即使型別不同也不行。
4、其他變數、函式等名稱構成一個名稱空間,不能重名。
因此,C語言的名稱空間基本都預設定義好了,使用者可自定義的部分基本沒有。

C++/C#語言的名稱空間就包含了可自定義的部分,你可以自己定義宣告一個名稱空間,在此空間內獨立使用自己的各種變數名稱,不同使用者間的名稱空間不會產生衝突。
C++宣告一個名稱空間:

namespace abc{程式碼}

C++中使用一個名稱空間:

using namespace abc;

C++中直接使用某空間的程式碼

abc::func();        //func()為該空間中的一個函式

C#宣告一個名稱空間:

namespace abc{程式碼}

C#中使用一個名稱空間:

using abc;

C#中直接使用某空間中的程式碼

abc.func();         //func
()為該空間中的一個函式

Java中的“包”的概念與“名稱空間”相似,均可避免命名衝突,對訪問進行控制,但在底層機制上還有所不同,Java的包邏輯結構與物理結構的統一,即一個包對應於磁碟上的一個資料夾,不同包裡的物件名稱自然可以相同,而名稱空間在儲存時並沒有這樣一種資料夾的形式,並且Java裡包均是並列的,不存在包中再建立一個包的關係,而名稱空間可以巢狀。