2012-08-28 12 views
25

Domanda rapida e semplice. In qualche modo capisco cosa fa il qualificatore del namespace Namespace, è per accedere ai membri in uno spazio dei nomi, tuttavia lo fa anche l'operatore di dereferenziazione. Sono davvero sconcertato sulla differenza in questa situazione, sul perché usereste l'una sull'altra o su come entrambe realizzino la stessa cosa.C# Namespace Qualificatore alias (: :) vs Dereferencing Operator (.)

using colAlias = System.Collections; 

namespace myns 
{ 
    class TestApp 
    { 
     static void Main() 
     { 
      colAlias.Hashtable test = new colAlias.Hashtable(); 
      colAlias::Hashtable test1 = new colAlias::Hashtable(); 
     } 
    } 
} 
+9

+1 Solo perché ho programmato in C# per alcuni anni e non ho mai visto questo operatore utilizzato da nessuna parte. : D – Tudor

+0

@Tudor La stessa situazione qui :) Molto raramente visto, ma l'ho incontrato oggi e volevo saperne di più. –

risposta

11

Questo è un caso angolo :: (come il prefisso @) è lì per gestire le occorrenze piuttosto rare in cui un nome è in conflitto tra spazi dei nomi, classi e parole chiave.

:: funziona solo per spazi dei nomi (e alias dei nomi), mentre .. funziona sia per spazi dei nomi che per sottoclassi. La maggior parte dei posti in cui ti serve è meglio usare un nome diverso, ma non è sempre un'opzione.

global:: è un caso speciale che si vede più spesso nel codice generato automaticamente: reimposta lo spazio dei nomi di riferimento alla radice.

Ad esempio, supponiamo di generare automaticamente del codice (magari per un'app moduli, EF o simile) e l'app utilizza lo spazio dei nomi YourCompany.Application. Ora uno dei tuoi clienti (usando la tua auto-generazione) decide di aggiungere il proprio spazio dei nomi nella loro app TheirCompany.YourCompany.Application. Ora tutto il il tuo codice auto fallisce perché quando compila .Net non sa se usare il tuo spazio dei nomi o il loro.

Per risolvere questo codice generare con global::YourCompany.Application, quindi quelli che utilizzano il generatore automatico possono utilizzare qualsiasi spazio dei nomi che piace e non conflitto.

Penso che Microsoft ha aggiunto global:: perché si aspettava che alcuni clienti .Net aggiungessero spazi dei nomi come System.

+0

_Penso che Microsoft abbia aggiunto global :: because ..._ Non esattamente: "Potrebbe essere necessario fare riferimento a due versioni di assembly con lo stesso nome di tipo completo" –

2

C'è un MSDN page che spiega come funziona.

Fondamentalmente, nella vostra situazione otterranno lo stesso risultato e per la leggibilità del codice è preferibile utilizzare un singolo ..

Non userei l'operatore :: su qualsiasi cosa tranne lo spazio dei nomi globale, e anche in questo caso ci sono più che sufficienti modi per aggirarlo.

modifica: Ulteriori informazioni su ciò che l'operatore fa è spiegato nell'articolo :: Operator (C# Reference).

0

Il qualificatore di alias dello spazio dei nomi (: :) consente di accedere ai metodi dello spazio dei nomi senza causare errori se si dispone di spazi dei nomi CONFLITTI utilizzando la stessa convenzione di denominazione.

Per esempio, come spiegato qui in MSDN http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx

+0

Bene, grazie per la risposta, ma ho pensato che anch'io, ho letto la mia descrizione. Quello che volevo sapere erano le differenze e, ad esempio, perché non si poteva usare l'operatore di dereferenziazione per accedere al namespace globale ... perché si userebbe l'uno sull'altro ... –

+1

@FranciscoAguilera Supponiamo tu abbia il tuo Classe di sistema. In questo caso, come utilizzeresti l'operatore di dereferenziazione per accedere a System.Console.WriteLine se lo desideri? Quindi si utilizza il qualificatore di alias dello spazio dei nomi per accedere allo spazio dei nomi globale ( globale :: System.Console.WriteLine()) per evitare il conflitto. – TWickz

1

L'idea generale di un qualificatore spazio dei nomi è quello di consentire di fare riferimento allo spazio dei nomi, anche se il nome è stato utilizzato altrove. Se hai dichiarato una classe denominata "colAlias", colAlias.Hashtable farebbe riferimento alla classe ma colAlias ​​:: Hashtable farebbe riferimento al valore dello spazio dei nomi.

Questo è un caso d'uso abbastanza stretto e global:: è l'unico caso di utilizzo tipico che ho visto per questo operatore (quando si cerca di garantire che non si verifichino conflitti durante la creazione di codice generato da compilare in un'applicazione sconosciuta).

6

Lei ha detto:

Namespace qualificazione Alias ​​fa, è per l'accesso ai membri di un namespace , però così fa l'operatore dereferenziazione.

Bene, no. L'operatore . viene utilizzato per accedere a qualsiasi membro, incluse le funzioni. È Non può fare Console::WriteLine();

:: è solo per risolvere gli spazi dei nomi, sia da un alias namespace in questo modo:

using colAlias = System.Collections; 
... 
... 
colAlias::Hashtable test = new colAlias::Hashtable(); 

O dal globale.

global::System.Console.WriteLine(..); 

È Non può fare:

System.Collections::ArrayList a = new System.Collections.ArrayList(); 

MA, se si dispone di un alias l'operatore . funziona anche, in modo nel tuo caso, non c'è differenza.

+0

Ciò significa che l'operatore '.' può fare tutto ciò che l'operatore' :: 'può e altro, ad eccezione del riferimento allo spazio dei nomi globale? – j00hi