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

本文关键字:关联 运算符 点运算 全局 为什么 C#- 关键字 | 更新日期: 2023-09-27 18:29:05

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

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

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

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

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

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

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

假设您在当前命名空间中有一个类System

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

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

全局命名空间别名在另一种情况下也很有用:当您引用两个DLL并且它们具有相同的命名空间和类时(例如,因为它们只是相同内容的两个版本)。在这种情况下,你怎么能引用它们呢?与这里描述的C++问题相同。您可以更改名称空间以包含版本号,但每次更改都很麻烦(VS自动重构AFAIK不适用于名称空间),或者您可以使用两个别名引用它们。例如,它们将被访问,如下所示:

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

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


关于::.的推理。。。这对SO来说不是一个问题(除非你很幸运,埃里克在SO上玩得很开心),但我猜这是因为它们是不同的东西。如果使用相同的运算符.,那么解析器如何理解global.System要使用全局名称空间别名而不是名为global的类或名称空间?他们不得不将global作为一个保留关键字,而这并不能解决冲突层次结构的另一个问题。。。