C#中作用域解析运算符::和成员访问运算符.的区别

7
在C#中,A::BA.B之间有什么区别?我注意到的唯一区别是只有::可以与global一起使用,但除此之外,它们有什么区别?为什么它们都存在?
2个回答

6

::运算符只能与别名一起使用,global是提供的特殊系统别名。

所以...这样可以:

using Foo = System.ComponentModel;

public MyClass {

  private Foo::SomeClassFromSystemComponentModel X;

}

但不包括这个:

但不包括这个:

public MyClass {

  private System.ComponentModel::SomeClassFromSystemComponentModel X;

}

这可以让你摆脱与库进行集成时出现的子命名空间地狱。
namespace MyAwesomeProduct.System
{

}

你的代码中有这样一段:
using MyAwesomeProduct;

global:: 可以让你找到真正的 System。

这里有MSDN信息


嗯...你解释了为什么global::很有用,但并没有说明::.之间的区别... - user541686
2
仅适用于别名 - 这样,如果有人稍后声明了与您别名相同的命名空间或子命名空间,则您的代码将不受影响。这是子命名空间解析的“出狱运算符”,如果您愿意的话。您可以在文件中控制别名,但其他人控制您使用的库的命名空间。当其他命名空间试图更改您的代码的含义时,它为您提供了控制权。 - Neil

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;
 }

有时候“.”是不明确的,所以需要使用“::”。以下是来自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
   }
}

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


那么你的意思是 :: 只能用于命名空间,而 . 可以用于除了 global 以外的所有东西? - user541686
是的,“::”只用于命名空间,这意味着您可以使用它来解决无法通过“.”解决的歧义。 - Robert Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接