2010-02-27 13 views

risposta

22

Fondamentalmente ne hai davvero bisogno quando vuoi usare due tipi con lo stesso nome completo (stesso spazio dei nomi, stesso nome di tipo) da diversi gruppi. Si dichiara un alias diverso per ciascun assembly, quindi è possibile fare riferimento a tale alias.

Inutile dire che si dovrebbe cercare di evitare di trovarsi in quella situazione per cominciare :)

Anson Horton ha un good blog post su di esso.

+0

Giusto per aggiungere - anche dopo l'aggiunta di extern dichiarazione di alias nella parte superiore del file comsumer * .cs, il compilatore di default non cerca il tipo che sto usando (che è presente in quell'assembly). Il comportamento predefinito diCompiler è sempre quello di cercare classi e tipi nel corrente e gli assembly referenziati con alias 'global'. Finisco per usare un nome di tipo completo che inizia con il nome dell'alias esterno, ad es. la mia dichiarazione dell'alias esterno era "alias esterno WidgetsVendor1;" e scrivevo ancora codice come 'var wid = new WidgetsVendor1.Widgets.Widget();'. Non posso semplicemente fare ''var wid = new Widgets.Widget() ; ' – RBT

+1

@RBT: No, solo * dichiara * l'alias. Ma potreste usare 'WidgetsVendor1.Widgets;' e scrivere 'var wid = new Widget();'. –

+0

ohh. Interessante! Non lo sapevo. Ho pubblicato i miei commenti in base alla mia osservazione che ho avuto la mattina. Buono a sapersi. Sono in grado di importare gli spazi dei nomi all'interno dell'alias esterno usando la parola chiave 'using'. Grazie. – RBT

23

È lì per aiutarti a sollevarti da un buco davvero profondo scavato dal controllo delle versioni. Supponi che la tua prima versione del tuo programma utilizzi questa classe

using System; 

namespace Acme.Financial.Banking { 
    [Serializable] 
    public class BankAccount { 
    public double Balance { get; set; } 
    //... 
    } 
} 

E con questo hai serializzato molti record di conti bancari. E un ragioniere inizia a lamentarsi dello stato patrimoniale essere fuori da un miliardesimo di un centesimo, in modo da cambiare la classe:

public decimal Balance { get; set; } 

Problema risolto, il prossimo cliente ha bilanci felici. Finché non ti viene chiesto di aggiornare un cliente esistente con molti record serializzati nel vecchio formato. Grande problema, non puoi più deserializzare i record da quando la classe è cambiata.

l'alias esterno risolve il problema, è possibile fare riferimento sia alla versione precedente che alla nuova versione della classe nel codice, anche se i nomi dei nomi dei nomi e delle classi sono gli stessi.

+1

Caso di utilizzo molto intuitivo per l'utilizzo dell'alias esterno. – RBT

Problemi correlati