var
est de type statique - le compilateur et le runtime connaissent le type - ils vous font juste économiser du texte ... les éléments 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 compris qu'il s
devait s'agir d'une chaîne (à partir de l'initialiseur). Dans les deux cas, il sait (dans l'IL) que cela s.Length
signifie la string.Length
propriété (instance) .
dynamic
est une bête très différente; il est le plus similaire object
, mais avec une répartition dynamique:
dynamic s = "abc";
Console.WriteLine(s.Length);
Ici, s
est tapé comme dynamique . Il ne sait pas string.Length
, parce qu'il ne sait pas quoi que ce soit au sujet s
au moment de la compilation. Par exemple, les éléments suivants compileraient (mais ne s'exécuteraient pas) également:
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Lors de l'exécution (uniquement), il vérifierait la FlibbleBananaSnowball
propriété - ne la trouverait pas et exploserait dans une pluie d'étincelles.
Avec dynamic
, les propriétés / méthodes / opérateurs / etc sont résolus au moment de l'exécution , en fonction de l'objet réel. Très pratique pour parler à COM (qui peut avoir des propriétés d'exécution uniquement), au DLR ou à d'autres systèmes dynamiques, comme javascript
.