一尘不染

C#4.0中的“动态”类型用于什么?

c#

C#4.0引入了一种称为“动态”的新类型。听起来不错,但是程序员会用它做什么呢?

有没有可以节省一天的情况?


阅读 258

收藏
2020-05-19

共1个答案

一尘不染

动态关键字是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

2020-05-19