2011-01-05 100 views
7

雖然經歷了一些遺留代碼,但我發現您可以聲明C#類而不將它放入命名空間中(在這種情況下,我有一個ASP.NET WebForms應用程序和一些Web窗體沒有在任何名稱空間內聲明)。具有空命名空間的AC#類

A GetType()在這樣的類上返回一個類型,其中namespace屬性設置爲null

我不知道這是允許的 - 任何人都可以提出爲什麼希望有一個沒有在名稱空間內聲明的類?

+0

哦,我不知道。我創建的東西並不總是(明確地)存在於類或名稱空間中,但是我又一次使用小黑客動態語言;) – delnan 2011-01-05 10:45:28

回答

5

這當然不是很好的做法。它確實使一些例子更容易,像「你好世界」 - 也許C#設計師要去代碼高爾夫球; p

但是,這是一個奇怪的。我不知道有任何響亮的理由,我們需要能夠直接使用全局命名空間。即使是擴展方法,我寧願加using指令給他們帶來...

有趣的是 - 似乎有在mscorlib.dll和20多名40多這樣的system.dll

var mscorlib = typeof(string).Assembly.GetTypes() 
    .Where(t => string.IsNullOrEmpty(t.Namespace)).ToList(); 
var system = typeof(Uri).Assembly.GetTypes() 
    .Where(t => string.IsNullOrEmpty(t.Namespace)).ToList(); 

(但所有私有/編譯器生成的)

+0

我能想到的一個基本原理就是讓簡單的例子更簡單。但是名稱空間的概念本身就相當簡單,而且也是一個相當基本的概念...... – 2011-01-05 10:56:57

3

也許允許與不支持命名空間的語言進行互操作。

更新

一個小洞穴探險之後,我可以看到,MS使用情況。

所有.Net Framework程序集在全局命名空間中都有一些標準類,例如

  • FXAssembly:version info。
  • ThisAssembly:程序集信息。
  • AssemblyRef:相關的程序集信息。

這些類包含罐裝的元數據,否則將難以\昂貴得到。我猜他們選擇在全局名稱空間中定位這些名稱空間,以便它們成爲tools \ utilities \ etc可以獲取的標準\常規位置。這些信息是引導\元信息,因此邏輯上位於命名空間的概念之上。

+1

看起來有可能,但我不禁想到,在與BCL交談時,任何此類語言都會受到嚴重損害 – 2011-01-05 10:50:50