乐趣区

C# ::作用域运算符

什么是作用域(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# 编程指南)

退出移动版