global ::用于冲突的命名空间

时间:2009-10-10 15:33:41

标签: c# namespaces

根据我的理解,global::限定符允许您访问已被另一个具有相同名称隐藏的命名空间。 MSDN page使用System作为示例。如果您创建自己的命名空间System,则可以使用global::System与原始命名空间联系。首先想到的是,为什么有人会调用他们的命名空间System?该页面继续说这显然不推荐,但在大型项目中很可能使用命名空间重复。如果/何时发生这种情况,是否表明事情正朝着错误的方向前进,或者是否有正当理由存在冲突的命名空间?

5 个答案:

答案 0 :(得分:13)

通常,global::用于表示“我想从命名空间结构的顶部开始”。如果我有一个名为MyProduct.System的命名空间,那么驻留在MyProduct命名空间中的任何内容都将无法访问Microsoft System命名空间。这是代码味道吗?也许有时,但不是特别臭。

答案 1 :(得分:7)

任何机器生成的代码都应该尝试使用global::,以尽量减少它可能不知道的命名空间冲突的可能性。此外,任何可能遇到冲突的代码都可以使用它来更具体。

答案 2 :(得分:7)

存在冲突命名空间的一个合理原因可能是使用为早期版本的.Net编写的内部库,这些库不包含在以后版本中添加的功能。例如,在.Net 1.1天中,我编写了一个包含API注册表调用的Registry类。通过纯粹的机会,我选择的方法名称与后来的.Net Registry类中的方法名称完全相同,并且它们完全相同,因此很容易拔掉我自己开发的代码。对于更复杂的东西,能够使用global::限定符来使用较旧的,命名不佳的代码块可能很有用。

使用现有的.Net命名空间故意命名一段新代码肯定是代码味道。

答案 3 :(得分:2)

Microsoft在优秀的书籍Framework Design Guidelines 2nd Ed.中有一些很好的命名空间指南。一般来说,他们建议不要引入冲突(例如,通过命名您的类型Stream)。

我不相信我曾经使用过global :: qualifier。我通常会认为这是一种代码味道(尽管有例外情况,因为MusiGenesis和sixlettervariables指出了这一点。)

答案 4 :(得分:0)

我认为你的名称空间中有一个名称是另一个名称。例如,我有一个名称空间.Persistence.NHibernate,其中NHibernate也可以是NHibernate程序集的根名称空间。

我在这里看不到任何代码味道,它只是命名isses;)