什么是作用域(scope)?简单来说,是变量在程序中的起作用范围。一般来说,一个变量只有在特定的区域内是有意义的,那么,限定这个变量的有效区域的代码范围就是这个变量的作用域。作用域的使用能够减少名字冲突,即在不同的作用域可以存在相同名字的变量。在C#中,变量的作用域在他所处的最近的一对花括号内。还有一个被称作全局作用域的,它的范围够覆盖能创建的新文件的全部上下文。

作用域运算符:“::”通常情况下,调用变量的时候,最先调用的是距离最近的当前作用域的变量。即,作用域越小优先级越高。如果希望在局部变量的作用域内使用同名的全局变量,可以在该变量前加上“::” ,“::”称为作用域运算符。如果有两个同名变量,一个是全局变量,另一个是局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。所以,作用域运算符可以用来解决局部变量与全局变量的重名问题,即在局部变量的作用域内,可用::对被屏蔽的同名的全局变量进行访问。

例如,在下面的代码中,Console 解析为 TestApp.Console 而不是 System 命名空间中的 Console 类型。

using System;
namespace Test
{
    class TestApp
    {
        //定义一个名为“System”的新类来引发问题。
        public class System { }
        //定义一个名为“Console”的常量以引发更多问题。
        const int Console = 7;
        const int number = 66;
        static void Main() =>
            //以下行导致错误。 它访问TestApp.Console,
            //这是一个常数。
            //Console.WriteLine();

            //使用 System.Console 仍会导致错误,因为类 TestApp.System 隐藏了 System 命名空间:
            // 以下行导致错误。 它访问TestApp.System,没有Console.WriteLine方法。
            //System.Console.WriteLine(number);

            //但是,可以使用 global::System.Console 解决此错误,如下所示:
            // OK
            global::System.Console.WriteLine(number);
}

显然,不建议将自己的命名空间的名称创建为 System,并且不可能会遇到发生此情况的代码。 但是,在大型项目中,很有可能会以一种或另一种形式发生命名空间重复。 在这些情况下,全局命名空间限定符可保证指定根命名空间。

参考:如何:使用全局命名空间别名(C# 编程指南)


DeAaronFox
11 声望1 粉丝