C# ::做用域运算符

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

做用域运算符:“::”一般状况下,调用变量的时候,最早调用的是距离最近的当前做用域的变量。即,做用域越小优先级越高。若是但愿在局部变量的做用域内使用同名的全局变量,能够在该变量前加上“::” ,“::”称为做用域运算符。若是有两个同名变量,一个是全局变量,另外一个是局部变量,那么局部变量在其做用域内具备较高的优先权,它将屏蔽全局变量。因此,做用域运算符能够用来解决局部变量与全局变量的重名问题,即在局部变量的做用域内,可用::对被屏蔽的同名的全局变量进行访问。ide

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

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,而且不可能会遇到发生此状况的代码。 可是,在大型项目中,颇有可能会以一种或另外一种形式发生命名空间重复。 在这些状况下,全局命名空间限定符可保证指定根命名空间。spa

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

相关文章
相关标签/搜索