繁体   English   中英

具有空命名空间的AC#类

[英]A C# class with a null namespace

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

此类上的GetType()返回一个类型,其中namespace属性设置为null

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

这当然不是很好的做法。 确实使一些例子更容易,比如“你好世界” - 也许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();

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

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

更新

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM