范围解析运算符::与成员访问运算符.在C#中

Meh*_*dad 7 c# scope-resolution operator-keyword

在C#中,A::B和之间的区别是A.B什么?我注意到的唯一区别是只能::使用global,但除此之外,有什么区别?为什么它们都存在?

Nei*_*eil 6

::运算符只适用于别名global是一个特殊的系统提供的别名.

所以......这有效:

using Foo = System.ComponentModel;

public MyClass {

  private Foo::SomeClassFromSystemComponentModel X;

}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

public MyClass {

  private System.ComponentModel::SomeClassFromSystemComponentModel X;

}
Run Code Online (Sandbox Code Playgroud)

这使您可以逃脱当您与他们拥有的库集成时可能出现的子命名空间的地狱:

namespace MyAwesomeProduct.System
{

}
Run Code Online (Sandbox Code Playgroud)

而且你的代码有

using MyAwesomeProduct;
Run Code Online (Sandbox Code Playgroud)

global ::让你找到真正的系统.

MSDN信息在这里

  • ::*only*与alases一起工作 - 如果有人声明一个名称空间或一个子名称空间以后具有与别名相同的命名空间将是正常的.如果你愿意的话,它是用于子命名空间解析的jail运算符.您可以控制文件中的alaises - 但是其他人控制您使用的libs的名称空间.::让您可以控制其他名称空间何时会改变代码的含义. (2认同)

Rob*_*evy 5

用::你可以做像......

 extern alias X;
 extern alias Y;
 class Test
 {
   X::N.A a;
   X::N.B b1;
   Y::N.B b2;
   Y::N.C c;
 }
Run Code Online (Sandbox Code Playgroud)

而且有时候.是不明确的所以::是需要的.这是C#语言规范的例子

namespace N
{
   public class A {}
   public class B {}
}
namespace N
{
   using A = System.IO;
   class X
   {
      A.Stream s1;         // Error, A is ambiguous
      A::Stream s2;        // Ok
   }
}
Run Code Online (Sandbox Code Playgroud)

http://download.microsoft.com/download/0/B/D/0BDA894F-2CCD-4C2C-B5A7-4EB1171962E5/CSharp%20Language%20Specification.htm