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

时间:2012-08-28 06:39:38

标签: 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();
        }
    }
}

5 个答案:

答案 0 :(得分:11)

这是一个极端情况::(就像@前缀一样)来处理命名空间,类和关键字之间名称冲突的极少数情况。

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

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

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

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

我认为Microsoft添加了global::因为他们希望某些.Net客户添加System这样的名称空间。

答案 1 :(得分:6)

你说:

  

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

嗯,不。 .运算符用于访问任何成员,包括函数。您不能执行Console::WriteLine();

::仅用于解析名称空间,可以来自如下命名空间别名:

using colAlias = System.Collections;
...
...
colAlias::Hashtable test = new colAlias::Hashtable();
来自全球的

OR

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

不能执行:

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

但是,如果你有一个别名,.运算符也可以运行,那么在你的情况下,没有区别。

答案 2 :(得分:2)

MSDN page解释这是如何运作的。

基本上,在您的情况下,他们将实现相同的目标,并且对于代码可读性,首选使用单个.

我不会在除了全局命名空间之外的任何地方使用::运算符,即使这样,也有足够的方法可以解决它。

编辑:有关运营商所做工作的更多信息,请参阅:: Operator (C# Reference)文章。

答案 3 :(得分:1)

命名空间限定符的一般概念是允许您引用命名空间,即使该名称已在其他地方使用过。如果您声明了一个名为“colAlias”的类,那么colAlias.Hashtable将引用该类,但colAlias :: Hashtable将引用该命名空间的值。

这是一个相当狭窄的用例,global::是我在这个运算符中看到的唯一典型用例(当尝试确保在创建生成的代码以便在未知应用程序中编译时不会发生冲突)

答案 4 :(得分:0)

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

例如,如msdn中所述 http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx