2009-10-10 278 views
8

據我所知,global::限定符允許你訪問被另一個名字空間隱藏的命名空間。 MSDN pageSystem爲例。如果您創建自己的名稱空間System,則可以使用global::System訪問原始文件。首先想到的是,爲什麼有人會打電話給他們的名字空間System ??該頁面繼續說這顯然不被推薦,但是在大型項目中命名空間重複是非常可能的。如果/發生這種情況,是否表明事情朝着錯誤的方向發展,或者是否存在有衝突的命名空間的正當理由?global ::用於衝突的命名空間

+0

是否有良好的代碼氣味? :p – 2009-10-10 16:05:16

+0

@rpflo:也許他的意思是「這是一種嚴重的代碼味道?」 – 2009-10-10 16:06:40

+1

與良好的代碼相比,它的味道像丁香一樣。 :) – 2009-10-10 16:13:22

回答

7

命名空間衝突的一個合理原因可能是使用內部庫,這些內部庫是爲早期版本的.Net編寫的,它不包含在以後版本中添加的功能。例如,在.NET 1.1中,我寫了一個包含API註冊表調用的Registry類。純粹的機會,我選擇的方法名稱與後來的.Net註冊表類中的方法名稱完全相同,並且它們完成了相同的操作,所以很容易拔掉我自己生成的代碼。對於更復雜的東西,能夠使用global::限定符中較舊的,名字不完整的代碼塊可能很有用。

但是,故意使用現有的.Net命名空間命名一段新代碼肯定會是代碼異味。

12

通常,global::用於表示「我想從名稱空間結構的頂部開始」。如果我有一個名爲MyProduct.System的名稱空間,則駐留在MyProduct名稱空間中的任何內容都將無法訪問Microsoft System命名空間。它是一種代碼味道嗎?也許有時,但不是特別是臭。

7

任何機器生成的代碼都應該嘗試並使用global::以最大限度地減少它可能不知道的名稱空間衝突的可能性。而且,任何可能遇到衝突的代碼都可以使用它來更具體。

0

我認爲它只是不時發生,你的名字空間之一有另一個名稱。例如,我有一個命名空間.Persistence.NHibernate,其中NHibernate也可以是NHibernate程序集的根名稱空間。

我沒有看到任何代碼味道在這裏,它只是命名isses;)

2

微軟在優秀圖書Framework Design Guidelines 2nd Ed.一些很好的命名空間的指導方針。一般而言,他們建議不要引入衝突(例如,通過命名您的類型流)。

我不相信我曾經使用過global :: qualifier。我通常會認爲它是一種代碼味道(儘管有些例外,如MusiGenesis和sixlettervariables指出)。