La nuova parola chiave "dinamica" C # 4.0 deprezza la parola chiave "var"?
-
08-07-2019 - |
Domanda
Quando esce C # 4.0 e abbiamo la parola chiave dinamica come descritto in questa eccellente presentazione di Anders Hejlsberg , (C # si sta evolvendo più velocemente di quanto possa tenere il passo .. Non ho avuto molto tempo per familiarizzare con la parola chiave var)
Avrei ancora bisogno della parola chiave var? C'è qualcosa che var può fare ... che la dinamica non può?
var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
Soluzione
No, sono molto diversi.
var
significa " inferisce il tipo della variabile in fase di compilazione " - ma è ancora interamente legato staticamente.
dinamico
significa " presumo che io possa fare tutto ciò che voglio con questa variabile " - vale a dire, il compilatore non sa quali operazioni sono disponibili e il DLR capirà cosa significano le chiamate realmente al momento dell'esecuzione.
Mi aspetto di usare dinamico
molto raramente - solo quando voglio davvero un comportamento dinamico:
-
var
ti consente di catturare errori di battitura ecc. in fase di compilazione - il codice associato staticamente verrà sempre eseguito più velocemente del codice associato dinamicamente (anche se la differenza diventa ragionevolmente piccola)
- il codice associato staticamente offre più supporto in fase di compilazione oltre agli errori: puoi trovare gerarchie di chiamate, il refactoring funzionerà meglio, Intellisense è disponibile ecc.
Altri suggerimenti
Dynamic e var rappresentano due idee completamente diverse.
var
Var chiede essenzialmente al compilatore di capire il tipo di variabile in base all'espressione sul lato destro dell'istruzione di assegnazione. La variabile viene quindi trattata esattamente come se fosse esplicitamente dichiarata come il tipo dell'espressione. Ad esempio le seguenti due affermazioni sono equivalenti
var a = "foo";
string a = "foo";
La chiave da portare via è che " var " è sicuro al 100% ed è un'operazione di compilazione
dinamica
La dinamica è per molti versi l'esatto contrario di var. L'uso della dinamica sta essenzialmente eliminando la sicurezza di tutti i tipi per quella particolare variabile. In molti modi non ha tipo. Quando si chiama un metodo o un campo sulla variabile, la determinazione su come richiamare quel campo avviene in fase di esecuzione. Ad esempio
dynamic d = SomeOperation();
d.Foo(); // Will this fail or not? Won't know until you run the program
La chiave da portare via è che "dinamico" non è un tipo sicuro ed è un'operazione di runtime
Sì, avrai comunque bisogno di var:
Var è una variabile il cui tipo verrà dedotto dal compilatore.
A dinamico verrà assegnato il tipo in fase di esecuzione
Var i = "Hello World"
farà in modo che il suo tipo sia inferito come tipo stringa nel fare in modo che l'intelligenza ti dia tutti i metodi che la stringa può usare come,
i.Split("/")
Dove come:
dynamic i = "Hello World"
non verrà dedotto il suo tipo fino al runtime perché il complier non sa ancora che tipo è, ma ti consentirà comunque di farlo:
<*>ma quando chiama il metodo di cui hai bisogno potrebbe non riuscire perché il tipo è sbagliato e il metodo non è lì.