C#4.0引入了一种称为“动态”的新类型。听起来不错,但是程序员会用它做什么呢?
有没有可以节省一天的情况?
动态关键字是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