Оператор разрешения области :: Оператор доступа к элементу.в C # - PullRequest
7 голосов
/ 19 января 2011

В C # в чем разница между A::B и A.B?Единственное отличие, которое я заметил, заключается в том, что с global можно использовать только ::, но в чем же разница?Почему они оба существуют?

Ответы [ 2 ]

6 голосов
/ 19 января 2011

оператор :: работает только с псевдонимами. 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 информация здесь

5 голосов
/ 19 января 2011

с :: вы можете делать такие вещи, как ...

 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

...