C#命名空间别名限定符(::) VS对其操作()。(C# Namespace Alias quali

2019-07-31 05:53发布

快速和简单的问题。 我有点明白了命名空间别名限定符做什么,它是在一个命名空间访问成员,但正因为此,在对其操作。 我真的感到困惑,在这种情况下,为什么你会使用一个比其他的,或者他们是如何每完成同样的事情不同。

using colAlias = System.Collections;

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

Answer 1:

这是一个极端情况:: (如@前缀)是否有应对相当罕见的出现在那里命名空间,类和关键字之间的名称冲突。

::仅适用于命名空间(和命名空间的别名),而. 。 同时适用于命名空间和子类。 在那里你需要它,你会被关闭使用不同的名称,而不是更好,但事实并非总是一个选择最多的地方。

global::是最经常出现在自动生成的代码的特殊情况-它引用的命名空间重置为根。

例如,假设您自动生成一些代码(可能为形式的应用,EF或类似)和应用程序使用的命名空间YourCompany.Application 。 现在,你的客户(使用自动生成)的一个决定添加自己的命名空间,在其应用TheirCompany.YourCompany.Application 。 现在,所有自动代码失败,因为当它编译.NET不知道是否要使用你的命名空间或他们的。

为了解决这个问题与生成代码global::YourCompany.Application ,那么那些使用自动生成器可以使用他们喜欢的任何名称空间,而不是冲突。

我认为微软加入global::因为他们预计一些的.Net客户添加命名空间像System



Answer 2:

你说:

命名空间别名限定符呢,它是在一个命名空间访问成员,但正因为此,在对其操作。

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

::仅用于解析名称空间,无论是从空间别名是这样的:

using colAlias = System.Collections;
...
...
colAlias::Hashtable test = new colAlias::Hashtable();

为了全球。

global::System.Console.WriteLine(..);

可以这样做:

System.Collections::ArrayList a = new System.Collections.ArrayList();

但是,如果你有一个别名. 运营商也适用,所以你的情况 ,没有任何区别。



Answer 3:

这里有一个MSDN页面解释如何工作的。

基本上,在您的情况,他们将实现同样的事情,对于代码的可读性,它是最好使用单一.

我不会用::上任何东西,但全局命名空间操作,而且当时有足够多的方式来解决它。

编辑:更多信息什么操作者是在解释::运算符(C#参考)的文章。



Answer 4:

命名空间限定的总体思路是让你引用,即使该名称已在别处使用的命名空间。 如果你宣布一个名为类“colAlias”然后colAlias.Hashtable将引用类,但colAlias ::哈希表将引用namespace'd值。

这是一个相当狭窄的用例和global::是唯一典型的使用情况下,我已经看到了这个操作符(当试图以确保没有冲突创建生成的代码时未知的应用程序进行编译,可能会发生)。



Answer 5:

命名空间别名限定符(::)可以帮助您访问命名空间的方法,而不会导致错误,如果您在使用相同的命名约定相互冲突的命名空间。

例如按此处的说明在MSDN http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx



文章来源: C# Namespace Alias qualifier (::) vs Dereferencing Operator (.)