2009-03-16 13 views
63

Ho appena installato una versione di prova di ReSharper e una delle prime cose che ho notato è che suggerisce sempre di sostituire le variabili locali in modo esplicito digitati con quelli implicitamente digitati, ad esempio:Utilizzo di variabili locali implicitamente tipizzate

public string SomeMethod(int aParam) 
{ 
    int aNumber = SomeOtherMethod(aParam); 
    // should be changed to: 
    var aNumber = SomeOtherMethod(aParam); 
} 

I pensare che le variabili digitate in modo esplicito siano più leggibili (più esplicite).

Cosa ne pensi del suggerimento di ReSharper? C'è qualche vantaggio nell'usare variabili implicitamente tipizzate? Quando usi le vars implicite/esplicite?

+0

Dup: http://stackoverflow.com/questions/545616/why-would-var-be-a-bad-thing, http://stackoverflow.com/questions/633474/poll-c-do-you -use-var –

+0

sì, e http://stackoverflow.com/questions/236878/what-to-use-var-or-object-name-type – Razzie

+0

Puoi dire a Resharper di default a variabili esplicite ... o a Almeno tu potresti quando ho fatto il processo l'anno scorso –

risposta

74

personalmente uso solo “var” quando posso chiaramente distinguere il tipo di variabile semplicemente leggendo la dichiarazione, ad esempio:

var someVariable = new List<int>(); 

Nell'esempio precedente, la sua evidente che "var" si riferisce a "Lista <int>".

Non mi piace usare "var" quando devo andare a qualche definizione di metodo per scoprire quale variabile tipo "var" rappresenta o dover fare affidamento su visual studio-intelli-popup o qualunque cosa si chiami, ad esempio, questa non è ok per me:

var someVaraible = SomeMethod(); 

Voglio dire, che è la funzione “SomeMethod” dovrebbe tornare? Puoi dire solo guardando la riga di codice? No, non puoi, ecco perché evito di usare "var" in quelle situazioni.

6

È semplicemente più semplice digitare la parola chiave pseudo var a volte che un nome di tipo enorme, soprattutto se potrebbe essere coinvolto un generico. Tuttavia, dovresti sapere che sono funzionalmente identici. Non c'è differenza di prestazioni o niente in ogni caso. Il compilatore ricava il tipo del lato destro del compito e sostituisce var con quel tipo. Non sta accadendo in fase di esecuzione come una variante VB.

39

C'è un sacco di discussioni su questo, ma penso che tutto dipenda dal gusto personale, proprio come usare la parola chiave "this" quasi ovunque.

I personalmente preferisco variabili tipizzate esplicitamente, ma quando si utilizzano raccolte generiche nidificate le cose possono diventare più leggibili utilizzando una variabile tipizzata implicitamente. Guardate:

Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>(); 

vs:

var myDictionary = new Dictionary<string, Dictionary<string, string>>(); 

EDIT: questo SO argomento copre lo stesso argomento, con alcune belle risposte: What to use: var or object name type?

EDIT2: Lavorando molto con async al giorno d'oggi, trovo che l'uso di variabili tipizzate esplicitamente può a volte prevenire bug cattivi. Considera questo stupido esempio in cui vorresti restituire l'ID di un utente. Si consideri inoltre che GetUserAsync restituisce un Task<User>. Se si utilizzano le variabili implicitamente tipizzate, si finisce per utilizzare qualcosa di simile:

public long GetUserId() 
{ 
    var user = GetUserAsync(); 
    return user.Id; 
} 

Questo compila, ma è sbagliato. 'utente' è in realtà un Task<User>. E compila come Task ha anche una proprietà Id. In questo caso, verrebbe accidentalmente restituito l'Id di un compito al posto dell'Utente.

public long GetUserId() 
{ 
    User user = GetUserAsync(); 
    return user.Id; 
} 

È possibile che non si compila, come il compilatore si lamenta che non si può gettare un task a un utente. L'aggiunta della parola chiave await ovviamente risolve questo problema.

realtà ho avuto questo accada a me una volta :-)

6

FWIW, la parola chiave var è chiaramente leggibile in molti casi. Soprattutto se ...

  1. Il lato destro del compito è un'espressione di costruttore.

    var map = nuovo dizionario>();

  2. Le variabili locali hanno un buon nome.

HTH

17

Nel caso in cui alcuni non l'abbiano ancora notato, è possibile modificare facilmente i "suggerimenti" in Reshaper (Reshaper -> Opzioni -> Lingue -> Azioni contestuali -> "Sostituisci specifiche esplicite del tipo con 'var'").

Personalmente preferisco avere specifiche di tipo esplicite ovunque, ma non ne sono troppo schizzinoso.

+3

Un'altra opzione per disabilitare è in: Controllo codice ==> Gravità ispezione ==> C# ==> Utilizzare la parola chiave 'var' quando l'inizializzatore dichiara esplicitamente il tipo e Usa la parola chiave 'var' quando possibile – ThisGuy