varist statisch typisiert - der Compiler und die Laufzeit kennen den Typ - sie ersparen Ihnen nur einige Eingaben ... die folgenden sind 100% identisch:
var s = "abc";
Console.WriteLine(s.Length);
und
string s = "abc";
Console.WriteLine(s.Length);
Alles, was passiert ist, war, dass der Compiler herausgefunden hat, dass ses sich um eine Zeichenfolge handeln muss (vom Initialisierer). In beiden Fällen weiß es (in der IL), dass s.Lengthdies die (Instanz-) string.LengthEigenschaft bedeutet.
dynamicist ein ganz anderes Tier; es ist am ähnlichsten object, aber mit dynamischem Versand:
dynamic s = "abc";
Console.WriteLine(s.Length);
Hier swird als dynamisch eingegeben . Er weiß über nicht string.Length, weil sie nicht wissen , etwas über sbei der Kompilierung. Zum Beispiel würde Folgendes auch kompiliert (aber nicht ausgeführt):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Zur Laufzeit (nur), wäre es überprüft die FlibbleBananaSnowballEigenschaft - nicht um es zu finden, und in einem Funkenregen explodieren.
Mit dynamicwerden Eigenschaften / Methoden / Operatoren / usw. zur Laufzeit basierend auf dem tatsächlichen Objekt aufgelöst. Sehr praktisch für Gespräche mit COM (das nur Laufzeit-Eigenschaften haben kann), dem DLR oder anderen dynamischen Systemen wie javascript.