具有null命名空间的C#类

时间:2011-01-05 10:40:39

标签: c# namespaces

在浏览一些遗留代码时,我发现您可以声明一个C#类而不将其放在命名空间中(在这种情况下,我有一个ASP.NET WebForms应用程序,并且某些Web表单未在任何命名空间中声明)。

此类上的GetType()会返回namespace属性设置为null的类型。

我不知道这是允许的 - 有人可以建议为什么有一个未在命名空间内声明的类是理想的吗?

2 个答案:

答案 0 :(得分:5)

这当然不是很好的做法。 确实使一些例子更容易,比如“hello world” - 也许C#设计师正在寻找代码高尔夫; p

但是,是的,这很奇怪。我不知道我们需要能够直接使用全局命名空间的任何响亮的原因。即使对于扩展方法,我宁愿添加一个using指令来将它们带入......

有趣的是 - mscorlib.dll中似乎有40多个,system.dll中有20多个

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();

(但所有私有/编译器生成的)

答案 1 :(得分:3)

或许允许与不支持命名空间的语言进行互操作。

<强>更新

经过一番洞察,我可以看到MS使用的案例。

所有.Net Framework程序集在全局命名空间中都有一些标准类,例如

  • FXAssembly:版本信息。
  • ThisAssembly:装配信息。
  • AssemblyRef:依赖汇编信息。

这些类包含固定的元数据,否则这些元数据将更加困难或昂贵。我猜他们选择在全局命名空间中找到它们,这样它就是一个标准\传统的位置,工具\实用程序\等可以获得它们。此信息是bootstrapping \ meta信息,因此逻辑上位于命名空间的概念之上。