繁体   English   中英

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

[英]C# Namespace Alias qualifier (::) vs Dereferencing Operator (.)

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

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这样的名称空间。

你说:

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

好吧,不。 . operator用于访问任何成员,包括函数。 不能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 :: Hashtable将引用该命名空间的值。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM