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

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

【问题讨论】:

    标签: c# operator-keyword scope-resolution


    【解决方案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 之外的所有内容?
    • 是的, :: 仅用于命名空间这一事实意味着您可以使用它来解决无法通过 . 解决的歧义
    猜你喜欢
    • 2012-04-20
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2014-10-05
    • 2015-12-18
    • 2013-12-12
    • 2010-09-09
    相关资源
    最近更新 更多