C# – 命名空间中的类型声明

什么可能是在命名空间中声明类型但不在类中声明类型的可能用法。

例如:

namespace Test { public delegate void Ispossible(); } 

这是有效的,不会产生任何编译错误,但我想不出为什么我们会这样声明它而不是在类中。

命名空间是.NET中的高级组织单位。

类中声明类型通常是不受欢迎的(但是,与所有事情一样,它不是100%规则)因为它可以使类型更紧密地耦合并且更难以找到。

VB.NET模块有点例外( 编辑 :它们实际上更像是编译器技巧/语法 – 糖),但通常.NET生态系统中的所有内容都包含在命名空间中。

你的例子有助于重用; 如果它在一个类中,则意味着委托只应该由该类使用,并且可能导致重复的委托被不必要地引入。


更新:当只使用少数几种类型时,命名空间似乎没什么用处,但没有它们,任何规模的项目都将是组织上的灾难。 想象一下没有名称空间的.NET框架,一个(可能是过时的)计数将框架置于3500类型。

命名空间就像文档的文件夹或抽屉; 一些松散的纸张很容易管理,但如果你有很多页面,那么找到你需要的那些纸张就会变得很痛苦。

给文档一个读取,它很短并且不是非常复杂(也不是命名空间)但有两个不错的点MSDN – 命名空间(c#)

如果它是一个多用途委托,如FuncEventHandler ,它与特定的类无关,那么你应该直接在命名空间中声明它。

你的短语(“可能是在命名空间中声明类型而不是在类中使用的可能用途。”)表示你在“类型”和“类”之间进行区分。 空无一人。 类是一种类型。

那么,在什么条件下你想直接在命名空间中声明一个类(即最常用的方式)? 这些相同的原因适用于其他类型。

命名空间和类都可用于组织层次结构中的信息。 但是,名称空间允许跨dll边界分发定义,但类不允许。 类也需要在类型名称之前放置类名,但是名称空间允许使用关键字“using”。

因此,如果要在不同dll中的一个名称空间中定义委托,则使用名称空间。

如果要强制人们使用任何其他名称为类型名称添加前缀而不依赖于名称空间上下文,则使用类。