C#Namespace Alias限定符(::) vs解除引用运算符(.)

Fra*_*era 26 c# namespaces global dereference

快速而简单的问题.我有点理解命名空间别名限定符的作用,它用于访问命名空间中的成员,但解除引用操作符也是如此.我对这种情况的不同感到困惑,为什么你会使用一个而不是另一个,或者他们各自如何完成同样的事情.

using colAlias = System.Collections;

namespace myns
{
    class TestApp
    {
        static void Main()
        {
            colAlias.Hashtable test = new colAlias.Hashtable();
            colAlias::Hashtable test1 = new colAlias::Hashtable();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*ith 11

这是一个极端情况::(如@前缀),用于处理命名空间,类和关键字之间名称冲突的极少数情况.

::仅适用于名称空间(和名称空间别名),而..适用于命名空间和子类.大多数你需要它的地方你最好使用不同的名字,但这并不总是一个选择.

global:: 是自动生成代码中最常见的特殊情况 - 它将引用的命名空间重置为根.

例如,假设您自动生成一些代码(可能用于表单应用程序,EF或类似代码),并且您的应用程序使用命名空间YourCompany.Application.现在,您的一个客户(使用您的自动生成)决定在他们的应用程序中添加自己的命名空间TheirCompany.YourCompany.Application.现在你的所有自动代码都失败了,因为它编译时.Net不知道是否使用你的命名空间或他们的命名空间.

要修复此生成代码global::YourCompany.Application,那么使用您的自动生成器的那些可以使用他们喜欢的任何名称空间而不会发生冲突.

我认为微软的补充global::是因为他们希望一些.Net客户能够添加名称空间System.


gid*_*eon 6

你说:

命名空间别名限定符用于访问命名空间中的成员,但解除引用操作符也是如此.

好吧,不.的.操作者用于访问任何成员,包括函数.你不能Console::WriteLine();

:: 仅用于从名称空间别名解析名称空间,如下所示:

using colAlias = System.Collections;
...
...
colAlias::Hashtable test = new colAlias::Hashtable();
Run Code Online (Sandbox Code Playgroud)

来自全球.

global::System.Console.WriteLine(..);
Run Code Online (Sandbox Code Playgroud)

不能做的:

System.Collections::ArrayList a = new System.Collections.ArrayList();
Run Code Online (Sandbox Code Playgroud)

但是,如果你有一个别名.,那么操作员也可以工作,所以在你的情况下,没有区别.