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
È stato utile?

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ì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top