2009-10-10 106 views
8

据我所知,global::限定符允许你访问被另一个名字空间隐藏的命名空间。 MSDN pageSystem为例。如果您创建自己的名称空间System,则可以使用global::System访问原始文件。首先想到的是,为什么有人会打电话给他们的名字空间System ??该页面继续说这显然不被推荐,但是在大型项目中命名空间重复是非常可能的。如果/发生这种情况,是否表明事情朝着错误的方向发展,或者是否存在有冲突的命名空间的正当理由?global ::用于冲突的命名空间

+0

是否有良好的代码气味? :p – 2009-10-10 16:05:16

+0

@rpflo:也许他的意思是“这是一种严重的代码味道?” – 2009-10-10 16:06:40

+1

与良好的代码相比,它的味道像丁香一样。 :) – 2009-10-10 16:13:22

回答

7

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

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

12

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

7

任何机器生成的代码都应该尝试并使用global::以最大限度地减少它可能不知道的名称空间冲突的可能性。而且,任何可能遇到冲突的代码都可以使用它来更具体。

0

我认为它只是不时发生,你的名字空间之一有另一个名称。例如,我有一个命名空间.Persistence.NHibernate,其中NHibernate也可以是NHibernate程序集的根名称空间。

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

2

微软在优秀图书Framework Design Guidelines 2nd Ed.一些很好的命名空间的指导方针。一般而言,他们建议不要引入冲突(例如,通过命名您的类型流)。

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