【问题标题】:A C# class with a null namespace具有空命名空间的 C# 类
【发布时间】:2011-06-03 22:33:37
【问题描述】:

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

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

我不知道这是允许的 - 任何人都可以提出为什么希望有一个未在命名空间中声明的类?

【问题讨论】:

  • 哦,我不知道。我创建的东西并不(明确地)一直存在于类或命名空间中,但话又说回来,我使用的是微不足道的 hackish 动态语言;)

标签: c# namespaces


【解决方案1】:

这当然不是很好的做法。它确实使一些示例变得更容易,例如“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();

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

【讨论】:

  • 我能想到的一个理由是让简单的例子更简单。但是命名空间的概念本身非常简单,也是一个相当基本的概念......
【解决方案2】:

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

更新

经过一番探索,我可以看到 MS 使用的一个案例。

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

  • FXAssembly:版本信息。
  • ThisAssembly:程序集信息。
  • AssemblyRef:依赖的程序集信息。

这些类包含罐头元数据,否则这些元数据将更难/更昂贵。我猜他们选择将它们定位在全局命名空间中,以便它成为工具\实用程序\等可以获取它们的标准\常规位置。此信息是引导\元信息,因此逻辑上位于命名空间概念之上。

【讨论】:

  • 这似乎是可能的,但我不禁想到任何这样的语言在与 BCL 交谈时都会相当残废
猜你喜欢
  • 2011-12-01
  • 2017-06-03
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多