據我所知,global::
限定符允許你訪問被另一個名字空間隱藏的命名空間。 MSDN page以System
爲例。如果您創建自己的名稱空間System
,則可以使用global::System
訪問原始文件。首先想到的是,爲什麼有人會打電話給他們的名字空間System
??該頁面繼續說這顯然不被推薦,但是在大型項目中命名空間重複是非常可能的。如果/發生這種情況,是否表明事情朝着錯誤的方向發展,或者是否存在有衝突的命名空間的正當理由?global ::用於衝突的命名空間
回答
命名空間衝突的一個合理原因可能是使用內部庫,這些內部庫是爲早期版本的.Net編寫的,它不包含在以後版本中添加的功能。例如,在.NET 1.1中,我寫了一個包含API註冊表調用的Registry類。純粹的機會,我選擇的方法名稱與後來的.Net註冊表類中的方法名稱完全相同,並且它們完成了相同的操作,所以很容易拔掉我自己生成的代碼。對於更復雜的東西,能夠使用global::
限定符中較舊的,名字不完整的代碼塊可能很有用。
但是,故意使用現有的.Net命名空間命名一段新代碼肯定會是代碼異味。
通常,global::
用於表示「我想從名稱空間結構的頂部開始」。如果我有一個名爲MyProduct.System
的名稱空間,則駐留在MyProduct
名稱空間中的任何內容都將無法訪問Microsoft System
命名空間。它是一種代碼味道嗎?也許有時,但不是特別是臭。
任何機器生成的代碼都應該嘗試並使用global::
以最大限度地減少它可能不知道的名稱空間衝突的可能性。而且,任何可能遇到衝突的代碼都可以使用它來更具體。
我認爲它只是不時發生,你的名字空間之一有另一個名稱。例如,我有一個命名空間.Persistence.NHibernate,其中NHibernate也可以是NHibernate程序集的根名稱空間。
我沒有看到任何代碼味道在這裏,它只是命名isses;)
微軟在優秀圖書Framework Design Guidelines 2nd Ed.
一些很好的命名空間的指導方針。一般而言,他們建議不要引入衝突(例如,通過命名您的類型流)。
我不相信我曾經使用過global :: qualifier。我通常會認爲它是一種代碼味道(儘管有些例外,如MusiGenesis和sixlettervariables指出)。
- 1. 命名空間衝突
- 2. Fortran命名空間衝突
- 3. Javascript命名空間衝突
- 4. java命名空間衝突
- 5. 命名空間+類命名衝突
- 6. 別名和命名空間衝突
- 7. PHP命名空間別名衝突?
- 8. jQuery Limit Global命名空間
- 9. 朱莉婭的命名空間衝突
- 10. 衝突的命名空間在C#
- 11. Rollup - 衝突的命名空間
- 12. C++衝突的命名空間
- 13. 命名空間衝突在C++
- 14. XML DOM衝突命名空間問題
- 15. 命名空間和類衝突(?)
- 16. actionscript ExternalInterface命名空間衝突
- 17. Powershell參數命名空間衝突
- 18. 解決命名空間衝突
- 19. Groovy gdk命名空間衝突
- 20. 回形針命名空間衝突
- 21. 命名空間與類衝突
- 22. 斯威夫特命名空間衝突
- 23. XML名稱空間衝突
- 24. 衝突與定義newBox存在於命名空間內
- 25. 1151:衝突與定義mcPlayer存在於命名空間內
- 26. 如何解決兩個命名空間之間的衝突?
- 27. 運行時間分辨率C++命名空間衝突
- 28. SignalR命名空間衝突?不能使用MapHubs()
- 29. 不同庫之間的命名衝突
- 30. 修復C#中的命名空間衝突問題?
是否有良好的代碼氣味? :p – 2009-10-10 16:05:16
@rpflo:也許他的意思是「這是一種嚴重的代碼味道?」 – 2009-10-10 16:06:40
與良好的代碼相比,它的味道像丁香一樣。 :) – 2009-10-10 16:13:22