2011-01-05 99 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