【问题标题】:C# - Why is ::-operator assosiated with global keyword instead of the dot operator?C# - 为什么 ::-operator 与全局关键字而不是点运算符相关联?
【发布时间】:2014-11-04 08:45:44
【问题描述】:

本人来自 C++ 背景,需要一些时间来适应 C#。在 C# 中,使用点运算符 (.) 比 ::-operator(C# 中的命名空间限定符运算符)更频繁地使用来访问命名空间和类范围。

在 C++ 中,使用点运算符 (.) 来访问类实例的成员。另一方面,范围解析运算符 (::) 用于访问没有该类实例的类的成员。对我来说,这是有道理的,既合乎逻辑又一致。

虽然我可以接受 C# 中使用的不同方法,但似乎至少在一个实例中我看到了不一致之处。至少,在我看来是这样的。它与全局关键字有关:

global::System.Console.WriteLine("Hello World");

有人可以向我解释为什么命名空间别名限定符需要与全局关键字而不是点运算符一起使用吗?

【问题讨论】:

  • 因为global 是(实际上是匿名的)全局命名空间的命名空间别名,而不是命名空间本身
  • 始终将 C# 和 C++ 之间的相似视为意外,而不是设计目标。而且它做同样事情的几率与它在 C++ 中引起的麻烦的数量成反比。这是一个很多,C++ 中的名称解析非常复杂。 Microsoft C++ 编译器今天仍然存在重大错误。

标签: c# namespaces global operator-keyword


【解决方案1】:

这并不常见,但在某些情况下很方便。

假设你在 current 命名空间中有一个 System 类:

namespace Test {
    static class System {
        public static Do() { }
    }

    class Foo {
        void foo() {
            System.Do(); // What's this?
        }
    }
}

你想让它更复杂吗?在System 中添加一个内部类并调用它,例如Action。当然,这些都是边缘情况,您可能永远不需要使用global::,但语言本身必须处理这种情况。有关更多示例,请参阅MSDN

全局命名空间别名在另一种情况下也很有用:当您引用两个 DLL 并且它们具有相同的命名空间和类时(例如,因为它们只是相同 stuff版本 /em>)。在那种情况下,您如何引用它们?相同的problem described here for C++。您可以更改命名空间以包含版本号,但每次更改它都会很痛苦(并且 VS 自动重构 AFAIK 不适用于命名空间),或者您可以使用两个别名来引用它们。例如,它们将被访问,如下所示:

Version1::CompanyName.MyNamespace.MyClass
Version2::CompanyName.MyNamespace.MyClass

另请注意,当您生成代码(例如所有设计人员生成的代码)时,这是一个很好的做法(包括 global:: 命名空间),因为您不知道该代码在哪个场景中将被编译(然后可能会发生冲突)。


推理 ::. 嗯...这不是 SO 的问题(除非你很幸运 Eric 在 SO 上玩得很开心)但我可能猜这是因为它们是不同的东西。如果使用相同的运算符.,那么解析器如何理解global.System 你想使用全局命名空间别名而不是名为global 的类或命名空间?他们不得不将global 设为保留关键字,这并不能解决冲突 层次结构的其他问题...

【讨论】:

  • 当然,任何创建自己的名为“System”的类的人都需要对其进行检查。如果你发现你需要使用'global::',那么你可能做错了什么。
  • @DaveDoknjas 绝对!这有点更糟,因为同样的考虑也适用于属性、内部类和字段,但是是的......非常不常见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多