Parola chiave C # "var" rispetto a variabili esplicitamente definite [duplicato]
-
06-07-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- Uso della parola chiave var in C # 86 risposte
Attualmente sto usando la versione di prova di 30 giorni di ReSharper e finora sono rimasto colpito dai suggerimenti che offre. Un suggerimento però mi confonde.
Quando definisco esplicitamente una variabile, come ad esempio:
List<String> lstString = new List<String>();
ReSharped aggiunge una piccola linea verde e mi dice di:
Utilizza la dichiarazione di variabili locali di tipo implicito.
Se seguo il suo suggerimento, ReSharper cambia la riga di codice in:
var lstString = new List<String>();
Quindi, c'è una sorta di guadagno in termini di prestazioni derivante dalla modifica di List<String>
in var
, o è semplicemente una peculiarità di ReSharper? Mi è sempre stato insegnato che definire esplicitamente una variabile, piuttosto che usare una dinamica, è più ottimale.
Soluzione
Quindi, c'è una sorta di guadagno in termini di prestazioni che può derivare dalla modifica dell'elenco in un var
No, ma questo non è l'unico motivo valido per un refactoring. Ancora più importante, rimuove la ridondanza e rende il codice più breve senza alcuna perdita di chiarezza.
Mi è sempre stato insegnato che definire esplicitamente una variabile, piuttosto che usare una dinamica, è più ottimale.
Hai frainteso cosa significa var
. Questo non è in alcun modo dinamico, poiché produce lo stesso output. Significa solo che il compilatore calcola il tipo per la variabile da solo. È ovviamente in grado di farlo, poiché si tratta dello stesso meccanismo utilizzato per testare la sicurezza e la correttezza del tipo.
Rimuove anche una duplicazione del codice completamente inutile. Per i tipi semplici, questo potrebbe non essere molto. Ma considera:
SomeNamespace.AndSomeVeryLongTypeName foo = new SomeNamespace.AndSomeVeryLongTypeName();
Chiaramente, in questo caso il raddoppio del nome non è solo superfluo ma effettivamente dannoso.
Altri suggerimenti
No. Emettono il stesso identico IL .
È solo una questione di stile.
var
presenta il vantaggio che semplifica la modifica del tipo di funzioni di ritorno senza alterare altre parti del codice sorgente. Ad esempio, modificare il tipo di ritorno da IEnumerable<T>
a List<T>
. Tuttavia, potrebbe facilitare l'introduzione di bug.
La parola chiave var
non dichiara effettivamente una variabile con un tipo dinamico. La variabile è ancora tipizzata staticamente, ne deriva solo il tipo dal contesto.
È una buona scorciatoia quando hai un nome lungo (i nomi generici possono essere lunghi)
Meno battitura = maggiore produttività :)