【问题标题】:The use of global:: for conflicting namespaces使用 global:: 处理冲突的命名空间
【发布时间】:2010-12-05 14:47:22
【问题描述】:

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

【问题讨论】:

  • 有好的代码味道吗? :p
  • @rpflo:也许他的意思是“这是严重的代码异味吗?”
  • 伟大的标签:evil-doers.
  • 如果您至少没有一些代码异味,那么您就没有在最后期限内。

标签: c# namespaces


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我不相信我曾经使用过 global:: 限定符。我通常认为这是一种代码异味(尽管有例外,正如 MusiGenesis 和六字母变量所指出的那样)。

    【讨论】:

      【解决方案3】:

      我认为您的某个命名空间具有另一个名称的情况时有发生。例如,我有一个命名空间 .Persistence.NHibernate,其中 NHibernate 也可以是 NHibernate 程序集的根命名空间。

      我在这里没有看到任何代码异味,只是命名问题;)

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2019-02-11
            • 2010-09-20
            • 1970-01-01
            • 2012-09-12
            • 2013-01-26
            • 2010-11-15
            • 2012-12-18
            • 2012-02-06
            相关资源
            最近更新 更多