C#|::运算符和全局命名空间

发现 C# 还要和 C++ 一样的::运算符,来测试一下。

命名空间被赋值别名以后,可以隐藏掉原有的命名空间。想要访问需要完整路径。如果不用,可以用::运算法,它的优先级被高。

看下下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;

namespace ConsoleApp1
{
// 同名的别名空间
using MyNamespaceAlias = MyRootNamespace.MyNestedNamespace;

namespace MyRootNamespace
{
namespace MyNamespaceAlias
{
public class MyClass
{
public static void Print()
{
Console.WriteLine("MyRootNamespace.MyNamespaceAlias.MyClass.Print()");
}
}
}
namespace MyNestedNamespace
{
public class MyClass
{
public static void Print()
{
Console.WriteLine("MyRootNamespace.MyNestedNamespace.MyClass.Print()");
}
}
}


class Program
{
static void Main(string[] args)
{
MyRootNamespace.MyNestedNamespace.MyClass.Print(); // 可简化名称如下

MyRootNamespace.MyNamespaceAlias.MyClass.Print(); // 原有的 MyNamespaceAlias 命名空间屏蔽了别名空间。

// 使用::运算符,迫使编译器使用别名
MyNamespaceAlias::MyClass.Print();
// MyRootNamespace. MyNamespaceAlias::MyClass.Print(); // 这样会报错不行,原因是显然的,::指向别名。


Console.ReadKey();
}
}
}
}

对照输出顺序就,结合代码注释,可以看出区别:

1
2
3
MyRootNamespace.MyNestedNamespace.MyClass.Print()
MyRootNamespace.MyNamespaceAlias.MyClass.Print()
MyRootNamespace.MyNestedNamespace.MyClass.Print()

这种方式在大项目出现别名和.NET命名空间重名的时候有用,一般用不上吧?!

global是顶级根命名空间的别名,如果出现上面所说的那种情况,可以这样:

1
global::System.Collections.Generic.List<int>   // 一个示例
参考:
《C#入门经典第三版》P305
感谢支持!