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

Posted

技术标签:

【中文标题】范围解析运算符 :: 与成员访问运算符 。在 C# 中【英文标题】:Scope-resolution operator :: versus member-access operator . in C# 【发布时间】:2011-06-11 12:24:23 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

所以...这行得通:

using Foo = System.ComponentModel;

public MyClass 

  private Foo::SomeClassFromSystemComponentModel X;


但不是这个:

public MyClass 

  private System.ComponentModel::SomeClassFromSystemComponentModel X;


这可以让您摆脱在与它们拥有的库集成时可能出现的子命名空间的地狱:

namespace MyAwesomeProduct.System



而你在你的代码中有

using MyAwesomeProduct;

global:: 让您找到真正的系统。

MSDN info here

【讨论】:

嗯...您在解释为什么global:: 有用,但不完全是::. 之间的区别... :: only 与 alases 一起工作 - 这样,如果有人稍后声明一个名称空间或子名称空间,它与您的别名具有相同的名称空间,那么您的代码就可以了。如果您愿意,它是用于子命名空间解析的出狱运算符。您可以控制文件中的别名 - 但其他人控制您使用的库的名称空间。 :: 让您可以控制其他命名空间何时试图改变代码的含义。【参考方案2】:

使用 :: 你可以做...

 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 之外的所有内容? 是的, :: 仅用于命名空间这一事实意味着您可以使用它来解决无法通过 . 解决的歧义

以上是关于范围解析运算符 :: 与成员访问运算符 。在 C# 中的主要内容,如果未能解决你的问题,请参考以下文章

C# 命名空间别名限定符 (::) 与取消引用运算符 (.)

C#高级编程

指向具有私有构造函数的类的类成员的指针

重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符

C#图解教程 第十五章 接口

范围解析运算符语义