var
è di tipo statico - il compilatore e il runtime conoscono il tipo - ti fanno solo risparmiare un po 'di battitura ... i seguenti sono identici al 100%:
var s = "abc";
Console.WriteLine(s.Length);
e
string s = "abc";
Console.WriteLine(s.Length);
Tutto ciò che è accaduto è stato che il compilatore ha capito che s
deve essere una stringa (dall'inizializzatore). In entrambi i casi, sa (nell'IL) che s.Length
significa la string.Length
proprietà (istanza) .
dynamic
è una bestia molto diversa; è molto simile a object
, ma con spedizione dinamica:
dynamic s = "abc";
Console.WriteLine(s.Length);
Qui, s
viene digitato come dinamico . Essa non conosce string.Length
, perché non sa nulla riguardo s
al momento della compilazione. Ad esempio, compilerebbe (ma non eseguirà) anche quanto segue:
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
In fase di esecuzione (solo), verificherebbe la FlibbleBananaSnowball
proprietà, non riuscendo a trovarla ed esploderebbe in una pioggia di scintille.
Con dynamic
, proprietà / metodi / operatori / ecc vengono risolti in fase di esecuzione , in base all'oggetto reale. Molto utile per parlare con COM (che può avere proprietà solo di runtime), il DLR o altri sistemi dinamici, come javascript
.