C# 4.0 引入了一种称为“动态”的新类型。听起来不错,但是程序员会用它做什么呢?
有没有可以挽救一天的情况?
dynamic 关键字是 C# 4.0 的新关键字,用于告诉编译器变量的类型可以更改,或者直到运行时才知道。将其视为无需强制转换即可与对象交互。
dynamic cust = GetCustomer(); cust.FirstName = "foo"; // works as expected cust.Process(); // works as expected cust.MissingMethod(); // No method found!
请注意,我们不需要将 cust 强制转换或声明为 Customer 类型。因为我们声明它是动态的,所以运行时接管,然后为我们搜索并设置 FirstName 属性。现在,当然,当您使用动态变量时,您将放弃编译器类型检查。这意味着调用 cust.MissingMethod() 将编译并且直到运行时才会失败。此操作的结果是 RuntimeBinderException,因为未在 Customer 类上定义 MissingMethod。
上面的例子展示了调用方法和属性时动态是如何工作的。另一个强大的(并且有潜在危险的)功能是能够为不同类型的数据重用变量。我确信 Python、Ruby 和 Perl 程序员可以想出一百万种方法来利用这一点,但我使用 C# 已经很长时间了,以至于我觉得它是“错误的”。
dynamic foo = 123; foo = "bar";
好的,所以你很可能不会经常编写像上面这样的代码。然而,有时变量重用可能会派上用场或清理一段肮脏的遗留代码。我经常遇到的一个简单案例是不断地在十进制和双精度之间进行转换。
decimal foo = GetDecimalValue(); foo = foo / 2.5; // Does not compile foo = Math.Sqrt(foo); // Does not compile string bar = foo.ToString("c");
第二行无法编译,因为 2.5 被键入为双精度,而第 3 行无法编译,因为 Math.Sqrt 需要双精度。显然,您所要做的就是强制转换和/或更改您的变量类型,但在某些情况下可能使用动态是有意义的。
dynamic foo = GetDecimalValue(); // still returns a decimal foo = foo / 2.5; // The runtime takes care of this for us foo = Math.Sqrt(foo); // Again, the DLR works its magic string bar = foo.ToString("c");
阅读更多功能: http: //www.codeproject.com/KB/cs/CSharp4Features.aspx