var
是静态类型的-编译器和运行时 类型-它们只是为您节省了一些类型…以下是100%相同的:
var s = "abc";
Console.WriteLine(s.Length);
和
string s = "abc";
Console.WriteLine(s.Length);
发生的所有事情是 发现s
必须是一个字符串(来自初始化程序)。在两种情况下,它都知道(在IL中)s.Length
意味着(实例)string.Length
属性。
dynamic
是 不同的野兽;它与最为相似object
,但是具有动态分配功能:
dynamic s = "abc";
Console.WriteLine(s.Length);
在这里,s
键入 。它不知道string.Length
,因为它不知道 有关s
在编译时。例如,以下代码也将编译(但不运行):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananasnowball);
在运行时(仅),它将 检查 该FlibbleBananasnowball
属性-找不到它,并在火花中爆炸。
使用dynamic
,可以 根据实际对象解析属性/方法/运算符/等。与COM(可以具有仅运行时属性),DLR或其他动态系统(例如)交谈非常方便javascript
。