var
est typé statiquement - le compilateur et le runtime connaissent le type - ils vous permettent juste de taper moins... les deux exemples suivants sont à 100% identiques :
var s = "abc";
Console.WriteLine(s.Length);
et
string s = "abc";
Console.WriteLine(s.Length);
Tout ce qui s'est passé, c'est que le compilateur a déduit que s
devait être une chaîne de caractères (à partir de l'initialisation). Dans les deux cas, il sait (dans le code IL) que s.Length
signifie la propriété (instance) string.Length
.
dynamic
est une bête très différente ; il est similaire à object
, mais avec une distribution dynamique :
dynamic s = "abc";
Console.WriteLine(s.Length);
Ici, s
est typé comme dynamique. Il ne sait rien sur string.Length
, car il ne sait rien sur s
au moment de la compilation. Par exemple, le code suivant compilerait (mais ne s'exécuterait pas) aussi :
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
À l'exécution (seulement), il vérifierait la propriété FlibbleBananaSnowball
Avec dynamic
, les propriétés / méthodes / opérateurs / etc sont résolus à l'exécution, en fonction de l'objet réel. Très utile pour parler à COM (qui peut avoir des propriétés uniquement à l'exécution), le DLR, ou d'autres systèmes dynamiques, comme javascript
.