C# - 为什么:: - 运算符与全局关键字而不是点运算符相关联?

时间:2014-11-04 08:45:45

标签: c# namespaces global operator-keyword

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这种情况并不常见,但有些情况下很方便。

想象一下,你在当前命名空间中有一个类System

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

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

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

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

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

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


关于::.的推理......对于SO来说这不是一个问题(除非你很幸运Eric在这里有一些乐趣)但我猜可能是因为他们'不同的事情。如果使用相同的运算符.,那么解析器如何理解global.System您想要使用全局命名空间别名而不是名为global的类或命名空间?他们必须使global成为保留关键字,它不会解决冲突层次结构的其他问题...