首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C# 4.0中的“动态”类型是做什么用的?

C# 4.0中的“动态”类型是做什么用的?
EN

Stack Overflow用户
提问于 2010-04-22 20:14:45
回答 5查看 168.6K关注 0票数 261

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

有没有一种情况,它可以拯救世界?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-22 20:20:15

dynamic关键字是C# 4.0中新增的关键字,用于告诉编译器变量的类型可以更改,或者直到运行时才知道。可以将其视为能够与对象交互,而不必强制转换对象。

代码语言:javascript
复制
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。

上面的例子展示了在调用方法和属性时dynamic是如何工作的。另一个强大的(也是潜在危险的)特性是能够对不同类型的数据重用变量。我相信Python、Ruby和Perl程序员可以想出一百万种方法来利用这一点,但是我使用C#太久了,以至于我觉得它是“错误的”。

代码语言:javascript
复制
dynamic foo = 123;
foo = "bar";

好的,所以你很可能不会经常写像上面这样的代码。然而,有时变量重用可能会派上用场,或者清理一段肮脏的遗留代码。我经常遇到的一个简单情况是,必须不断地在小数和双精度之间进行转换。

代码语言:javascript
复制
decimal foo = GetDecimalValue();
foo = foo / 2.5; // Does not compile
foo = Math.Sqrt(foo); // Does not compile
string bar = foo.ToString("c");

第二行不能编译,因为2.5被定义为double类型,而第3行不能编译,因为Math.Sqrt需要double。显然,您所要做的就是强制转换和/或更改您的变量类型,但在某些情况下,使用dynamic可能是有意义的。

代码语言:javascript
复制
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

票数 219
EN

Stack Overflow用户

发布于 2017-04-10 02:32:26

下面是一个使用示例:

您使用了许多具有通用属性'CreationDate‘的类:

代码语言:javascript
复制
public class Contact
{
    // some properties

    public DateTime CreationDate { get; set; }        
}

public class Company
{
    // some properties

    public DateTime CreationDate { get; set; }

}

public class Opportunity
{
    // some properties

    public DateTime CreationDate { get; set; }

}

如果你写一个通信方法来检索'CreationDate‘属性的值,你必须使用反射:

代码语言:javascript
复制
    static DateTime RetrieveValueOfCreationDate(Object item)
    {
        return (DateTime)item.GetType().GetProperty("CreationDate").GetValue(item);
    }

有了“动态”的概念,你的代码就更优雅了:

代码语言:javascript
复制
    static DateTime RetrieveValueOfCreationDate(dynamic item)
    {
        return item.CreationDate;
    }
票数 6
EN

Stack Overflow用户

发布于 2010-04-22 20:16:25

COM互操作。尤其是IUnknown。它是专门为它设计的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2690623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档