2011-01-19 14 views

Odpowiedz

5

z :: można robić takie rzeczy jak ...

extern alias X; 
extern alias Y; 
class Test 
{ 
    X::N.A a; 
    X::N.B b1; 
    Y::N.B b2; 
    Y::N.C c; 
} 

i zdarza się. jest niejednoznaczny: jest potrzebny. oto przykład z języka C# specyfikacji

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

+0

Więc mówisz, że '' :: działa tylko z przestrzeniami nazw, podczas gdy '.' współpracuje ze wszystkiego z wyjątkiem' global'? – Mehrdad

+0

tak, fakt, że :: jest tylko dla przestrzeni nazw, oznacza, że ​​możesz go użyć, aby rozwiązać niejednoznaczność, której nie można rozwiązać. –

6

:: operator pracuje tylko z aliasów globalny jest specjalny system pod warunkiem, alias.

... tak to działa:

using Foo = System.ComponentModel; 

public MyClass { 

    private Foo::SomeClassFromSystemComponentModel X; 

} 

ale nie w ten sposób:

public MyClass { 

    private System.ComponentModel::SomeClassFromSystemComponentModel X; 

} 

To pozwala uciec od piekła nazw podsektorów, które mogą powstać podczas integracji z biblioteką gdzie mają:

namespace MyAwesomeProduct.System 
{ 

} 

I w was kodzie mają

using MyAwesomeProduct; 

global :: pozwala znaleźć prawdziwy system.

MSDN info here

+0

Hm ... wyjaśniasz, dlaczego 'global ::' jest użyteczne, ale nie jest to dokładnie różnica między ':' i '.' ... – Mehrdad

+2

:: * tylko * działa z alazami - tak, jeśli ktoś deklaruje przestrzeń nazw lub przestrzeń nazw później, która ma taką samą przestrzeń nazw jak alias, twój kod będzie w porządku. Jest to wydostanie się z operatora więzienia w celu uzyskania rozdzielczości podprzestrzennej, jeśli zechcesz. Masz kontrolę nad aliasami w swoim pliku - ale inne osoby kontrolują przestrzenie nazw używanych bibliotek. :: daje kontrolę, gdy inne przestrzenie nazw wpływają na zmianę znaczenia twojego kodu. – Neil

+0

+1 Fajnie, dzięki. – Mehrdad