蝈蝈俊.net

-- 用随笔来记录自己的技术感触

   博客堂 :: 首页 :: 联系 :: RSS 2.0 ::
随笔 - 670, 评论 - 4307, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

广告

 

C# 4.0引入了一个新类型:dynamic,简单来说,任何直接声明为这种类型的变量,或者从函数中返回这种类型的值,都将自动地视为后期绑定。即在运行时才会被初始化绑定。这类似于在Visual Basic中把变量声明为“object”,不过它现在可以支持任何类型系统了,不仅仅是CTS(通用类型规范)和COM。

C# 4.0 的主打特性就是动态类型。也就在这里体现。

在 New features in CSharp 4.docx 中提到 dymanic主要应用于下面的场景也是这样:

  • 自动反射
  • COM组件互操作
  • 混合编程,例如IronRuby和IronPython
  • 处理Html DOM对象

一个简单例子:

static void Main(string[] args)
{
    dynamic person = new System.Dynamic.ExpandoObject();
    person.Name = "cary";
    person.Age = 25;
    person.ShowDescription = new Func<string>(() => person.Name + person.Age);
    
    Console.WriteLine(person.Name + person.Age + person.ShowDescription());
    Console.ReadLine();
}

这里的 System.Dynamic.ExpandoObject 是个特殊的对象,简单地说它的行为可以被“扩展”——是如动态语言般真正的扩展,而非静态的多态。当我们使用dynamic 饰变量后,在它之上的方法调用会由编译器和DLR配合出不一样的行为。例如,我们在调用一个方法的时候,DLR会先检查这个动态对象上是否存在符合这个签名的方法,存在则最好,否则便会调用TryInvokeMember来“执行”一个动态方法,而它的参数便是此次调用的全部信息。这样的做法被称为“Method Missing”操作。

DLR 和 CLR 以及编程语言的关系看下图:

image_thumb_2

 

注意点:

使用 Dynamic 将导致只能在运行时才能被测试。这就是为什么当你用dynamic类型时,单元测试在你的代码中变得很重要,很重要!!

 

参考资料:

C#4.0新特性:可选参数,命名参数,Dynamic
http://www.cnblogs.com/carysun/archive/2009/12/09/CSharp4.html

翻译:Visual C# 4.0的新特性-第三部分-Dynamic ExpendoObject
http://www.cnblogs.com/codeyu/archive/2009/12/08/1616839.html

C# 4.0中dynamic的用法
http://space.itpub.net/740297/viewspace-600670

介绍C# 4.0新特性dynamic
http://developer.51cto.com/art/200908/144976.htm

二十行C#代码打造Ruby Markup Builder
http://www.cnblogs.com/JeffreyZhao/archive/2009/10/27/implement-ruby-markup-builder-in-20-lines-of-c-sharp-codes.html

Dynamic in C# 4.0: Introducing the ExpandoObject
http://blogs.msdn.com/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx

C#4.0的dynamic用法(一)——巧用反射
http://www.cnblogs.com/architect/archive/2009/03/13/1410921.html

C#动静结合编程之三:Duck Typing
http://www.cnblogs.com/weidagang2046/archive/2009/03/26/1421943.html

也谈.NET反射的封装
http://www.cnblogs.com/weidagang2046/archive/2009/04/30/1446928.html

C#动态特性的更多消息
http://www.infoq.com/cn/news/2009/04/Dynamic-CSharp

Fun With Method Missing and C# 4
http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx

打印 | 张贴于 2009-12-29 17:03:16 | Tag:.net 编程心得  技术随笔  设计思路  读书笔记  .Net 4.0

留言反馈

#re:C# 4.0 特性: dynamic 和 ExpandoObject 编辑
C#总是能给人惊喜
2010-01-05 00:34:53 | [匿名:Kevin Yang]
#re:C# 4.0 特性: dynamic 和 ExpandoObject 编辑
2010-01-03 23:35:53 | [匿名:futureboy]

发表留言

标题
姓名
邮件
主页
留言