快速和简单的问题。 我有点明白了命名空间别名限定符做什么,它是在一个命名空间访问成员,但正因为此,在对其操作。 我真的感到困惑,在这种情况下,为什么你会使用一个比其他的,或者他们是如何每完成同样的事情不同。
using colAlias = System.Collections;
namespace myns
{
class TestApp
{
static void Main()
{
colAlias.Hashtable test = new colAlias.Hashtable();
colAlias::Hashtable test1 = new colAlias::Hashtable();
}
}
}
这是一个极端情况::
(如@
前缀)是否有应对相当罕见的出现在那里命名空间,类和关键字之间的名称冲突。
::
仅适用于命名空间(和命名空间的别名),而.
。 同时适用于命名空间和子类。 在那里你需要它,你会被关闭使用不同的名称,而不是更好,但事实并非总是一个选择最多的地方。
global::
是最经常出现在自动生成的代码的特殊情况-它引用的命名空间重置为根。
例如,假设您自动生成一些代码(可能为形式的应用,EF或类似)和应用程序使用的命名空间YourCompany.Application
。 现在,你的客户(使用自动生成)的一个决定添加自己的命名空间,在其应用TheirCompany.YourCompany.Application
。 现在,所有的自动代码失败,因为当它编译.NET不知道是否要使用你的命名空间或他们的。
为了解决这个问题与生成代码global::YourCompany.Application
,那么那些使用自动生成器可以使用他们喜欢的任何名称空间,而不是冲突。
我认为微软加入global::
因为他们预计一些的.Net客户添加命名空间像System
。
你说:
命名空间别名限定符呢,它是在一个命名空间访问成员,但正因为此,在对其操作。
哦,不。 的.
操作者用于访问任何成员,包括函数。 你不能做Console::WriteLine();
::
仅用于解析名称空间,无论是从空间别名是这样的:
using colAlias = System.Collections;
...
...
colAlias::Hashtable test = new colAlias::Hashtable();
或为了全球。
global::System.Console.WriteLine(..);
你可以这样做:
System.Collections::ArrayList a = new System.Collections.ArrayList();
但是,如果你有一个别名.
运营商也适用,所以你的情况 ,没有任何区别。
这里有一个MSDN页面解释如何工作的。
基本上,在您的情况,他们将实现同样的事情,对于代码的可读性,它是最好使用单一.
。
我不会用::
上任何东西,但全局命名空间操作,而且当时有足够多的方式来解决它。
编辑:更多信息什么操作者是在解释::运算符(C#参考)的文章。
命名空间限定的总体思路是让你引用,即使该名称已在别处使用的命名空间。 如果你宣布一个名为类“colAlias”然后colAlias.Hashtable将引用类,但colAlias ::哈希表将引用namespace'd值。
这是一个相当狭窄的用例和global::
是唯一典型的使用情况下,我已经看到了这个操作符(当试图以确保没有冲突创建生成的代码时未知的应用程序进行编译,可能会发生)。
命名空间别名限定符(::)可以帮助您访问命名空间的方法,而不会导致错误,如果您在使用相同的命名约定相互冲突的命名空间。
例如按此处的说明在MSDN http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx