2011-01-19 13 views

risposta

5

con :: si possono fare cose come ...

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

e ci sono momenti in cui. è ambiguo quindi :: è necessario. ecco l'esempio del linguaggio C# spec

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

Quindi stai dicendo che '::' funziona solo con gli spazi dei nomi, mentre '.' funziona con tutto tranne' global'? – Mehrdad

+0

sì, il fatto che :: è solo per namespace significa che puoi usarlo per risolvere ambiguità che non può essere risolto da. –

6

l'operatore :: funziona solo con gli alias globale è un sistema speciale di alias.

così ... questo funziona:

using Foo = System.ComponentModel; 

public MyClass { 

    private Foo::SomeClassFromSystemComponentModel X; 

} 

ma non questa:

public MyClass { 

    private System.ComponentModel::SomeClassFromSystemComponentModel X; 

} 

Ciò consente di fuggire dall'inferno della sub namespace che può accadere quando si integra con una libreria dove hanno:

namespace MyAwesomeProduct.System 
{ 

} 

E tu in te codice avere

using MyAwesomeProduct; 

global :: consente di trovare il sistema reale.

MSDN info here

+0

Hm ... stai spiegando perché 'global ::' è utile, ma non esattamente la differenza tra '::' e '.' ... – Mehrdad

+2

:: * only * funziona con alases - in questo modo se qualcuno dichiara uno spazio dei nomi o uno spazio dei sottotitoli in seguito che abbia lo stesso spazio dei nomi dell'alias il tuo codice andrà bene. Se vuoi, è l'uscita dell'operatore jail per la risoluzione dello spazio dei nomi secondario. Hai il controllo di alaise nel tuo file - ma altre persone controllano gli spazi dei nomi delle librerie che usi. :: ti dà il controllo quando altri namespace riescono a cambiare il significato del tuo codice. – Neil

+0

+1 Cool, grazie. – Mehrdad