var
ist 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 s
es sich um eine Zeichenfolge handeln muss (vom Initialisierer). In beiden Fällen weiß es (in der IL), dass s.Length
dies die (Instanz-) string.Length
Eigenschaft bedeutet.
dynamic
ist ein ganz anderes Tier; es ist am ähnlichsten object
, aber mit dynamischem Versand:
dynamic s = "abc";
Console.WriteLine(s.Length);
Hier s
wird als dynamisch eingegeben . Er weiß über nicht string.Length
, weil sie nicht wissen , etwas über s
bei 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 FlibbleBananaSnowball
Eigenschaft - nicht um es zu finden, und in einem Funkenregen explodieren.
Mit dynamic
werden 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
.