2010-08-27 16 views
10

Quando dicoPerché dovrei usare variabili locali implicitamente tipizzate?

public static IMyType GetGateWayManager() 
{ 
    IUnityContainer _container = GetContainer(); 
    IMyType _gateWayManager = _container.Resolve<IMyType>(); 
    return _gateWayManager; 
} 

si tratta di dire un avvertimento Use implicitly types local variable.

Se cambio a

public static IMyType GetGateWayManager() 
{ 
    IUnityContainer _container = GetContainer(); 
    var_gateWayManager = _container.Resolve<IMyType>(); 
    return _gateWayManager; 
} 

va bene.

Qualcuno può dirmi perché l'editor VS ritiene che sia meglio usare var qui?

+4

Che cosa sta dando questo avviso? È il compilatore VS o uno strumento esterno come ReSharper? – codeulike

+1

Il fatto che tu dica "perdere il tipo" suggerisce che potresti trarre vantaggio dalla lettura della documentazione di 'var'. Non significa "variante". – AakashM

+2

sembra decisamente come avvertenza di Resharper ... –

risposta

12

Per chi sono i tipi?

Il compilatore? Si assolutamente. Il compilatore utilizza i tipi per rendere più probabile il corretto funzionamento del programma in fase di runtime, assicurando che i tipi corrispondano, che vengano chiamati metodi effettivamente esistenti e che passino loro i parametri del tipo corretto. Qui, il compilatore sta verificando che stai effettivamente restituendo qualcosa di tipo IMyType.

L'editor? Di nuovo, si. L'editor usa la compilazione in background e digita le informazioni per aiutarti a scrivere codice. Quando si preme . dopo _container utilizza le informazioni sul tipo per indicare che esiste un metodo Resolve e quali parametri richiede.

Tu? Non così tanto. Abbiamo già visto che il compilatore si assicurerà di restituire qualcosa di tipo IMyType, quindi perché ti interessa dichiararlo come quel tipo quando il compilatore può elaborarlo e controllarlo per te? Allo stesso modo, l'editor ti spiegherà i metodi sul contenitore, quindi perché ti preoccupi di dichiarare se si tratta di un contenitore Unity o di un altro tipo di contenitore, dato che sai già dal nome della variabile che è un contenitore di qualche tipo e dal editore che ha un metodo Resolve.

Non c'è alcun problema con la dichiarazione dei tipi per i locali, ma ciò che ReSharper ti dice è che il compilatore può elaborarlo, quindi sono informazioni ridondanti e il tuo codice potrebbe essere più chiaro con tipi impliciti e nomi di variabili validi. Ad esempio, lo scopo di questo codice è meno chiaro rispetto al campione originale?

public static IMyType GetGateWayManager() 
{ 
    var container = GetContainer(); 
    var gateWayManager = container.Resolve<IMyType>(); 
    return gateWayManager; 
} 
+3

C'è un vantaggio nella digitazione implicita, ovvero che se il tipo di ritorno di GetContainer è cambiato (ma ha mantenuto la stessa firma) sia perché è stato rinominato, o sostituito con un tipo simile, il codice di cui sopra non avrebbe bisogno di cambiare per far fronte. (Anche se dovrebbe essere ricostruito) – Massif

+0

Sì, buoni nomi di variabili. Che bella idea. Opacity_in_names_should_be_avoided. – Allen

2

Probabilmente non è l'editor VS, ma piuttosto ReSharper che ti sta dando questo messaggio. È più una questione di gusti che di buone pratiche. Ma una volta che ci si abitua alla parola chiave var, si comincia a piacergli sempre di più. Almeno ho imparato ad amarlo.

+0

Ma non utilizza ' var' influisce sulla perfomance del runtime? – Itsik

+2

@ltsik - No, non è diverso da dichiarare il tipo manualmente. –

+1

@Itsik, No, è solo zucchero di sintassi e verrà convertito nel tipo giusto al momento della compilazione. Non è un tipo dinamico, solo un modo per salvare il programmatore dalla scrittura di List >> ecc. –

1

It's Resharper avvisa, non VS editor.

5

Potrebbe essere il ReSharper.

ReSharper consiglia di utilizzare var quando il tipo di variabile può essere visualizzato nel codice. Nel tuo esempio possiamo vedere che _gateWayManager sarà di tipo IMyType, quindi utilizzeremo la parola chiave var per la digitazione implicita di variabile. _container verrà digitato esplicitamente nel codice perché non possiamo dire oggetto di quale tipo verrà restituito da GetContainer()

6

utilizzando var invece di tipo esplicito è suggerito da ReSharper perché è chiaro e utile.

Chiaro perché è stato scritto meno codice e il focus è sul nome della variabile anziché sul nome del tipo. Potresti pensare che il nome del tipo sia utile, ma dopo un po 'lo dimenticherai.

Utile perché quando si modifica un tipo di metodo restituito non sarà necessario modificare tutti i tipi nel modo.

Esempio:

int id = getId(); 
List<MyType> myList = FindById(id); 

In questa situazione se si cambia id da int a guid è necessario modificare questa "int" qui. Questo è piccolo, ma può facilmente diventare grande nei progetti di vita reale. Con var hai esattamente il codice per il compilatore e non hai bisogno di cambiarlo sempre.

var id = getId(); 
var myList = FindById(id); 

ho usato a preferire i tipi espliciti, ma solo poche ore dopo provare var non lascerò così facilmente.

Ricordare: var viene modificato in fase di compilazione per correggere il tipo. È diverso dalle dinamiche che non sono raccomandate in quasi tutti i casi.

+0

Quindi guardando il tuo secondo esempio, solo guardando il metodo FindById, che tipo viene restituito? Non si può dire, questo è lo svantaggio dei tipi impliciti. – LarryBud