var
ma typ statyczny - kompilator i środowisko wykonawcze znają typ - po prostu oszczędzają ci pisania ... następujące elementy są w 100% identyczne:
var s = "abc";
Console.WriteLine(s.Length);
i
string s = "abc";
Console.WriteLine(s.Length);
Wszystko, co się wydarzyło, polegało na tym, że kompilator zorientował się, że s
musi to być ciąg znaków (z inicjatora). W obu przypadkach wie (w IL), że s.Length
oznacza właściwość (instancja) string.Length
.
dynamic
jest zupełnie inną bestią; jest najbardziej podobny do object
dynamicznej wysyłki:
dynamic s = "abc";
Console.WriteLine(s.Length);
Tutaj s
jest wpisany jako dynamiczny . Nie wie o tym string.Length
, ponieważ nie wie nic o s
czasie kompilacji. Na przykład następujące polecenia również skompilują (ale nie uruchomią):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
W czasie wykonywania (tylko), to sprawdzić za FlibbleBananaSnowball
nieruchomości - uda się go znaleźć, i eksplodować w deszcz iskier.
Za pomocą dynamic
właściwości / metod / operatorów / itp. Są rozwiązywane w czasie wykonywania na podstawie rzeczywistego obiektu. Bardzo przydatny do rozmowy z COM (który może mieć właściwości tylko w czasie wykonywania), DLR lub innymi systemami dynamicznymi, takimi jak javascript
.