C#4.0动态语言

无意中网上看到介绍未来C#的文章:http://blogs.msdn.com/charlie/archive/2008/01/25/future-focus.aspx


    文章的大体意思就是,C#未来的发展方向肯定是面向对动态语言的支持这个方向了,也可以肯定的是C#将加入更多的动态语言的特性,这一点还是很值得期待的,文章中指出未来的C#将支持“dynamic lookup“的动态特性。

    目前透露的语法形式是这样:

    static void Main(string[] args)
    {
        dynamic
        {
            object myDynamicObject = GetDynamicObject();
            myDynamicObject.SomeMethod();         // call a method
            myDynamicObject.someString = "value"; // Set a field
            myDynamicObject[0] = 25;              // Access an indexer
        }
    }

    使用关键词“dynamic”,将想使用“dynamic lookup“动态特性的区域告知编译器,编译器将不在编译的时候检查“myDynamicObject”是否有下面的域或者方法,而是在运行时由DLR尝试强行调用这些东西,出错了再抛出异常。个人的理解就是,虽然支持所谓的“dynamic lookup”,但本质上还是需要全部编译为IL代码再运行的,本质上还是静态的,使用关键词“dynamic”的目的就是告诉编译器这里面不要做编译检查,让它通过,然后通过调用DLR部分功能,实现这种“dynamic lookup”的特性。

    文章还列举了采用“dynamic lookup“动态特性好处的三种场景:一个就是与COM组件的互操作上(这点我没大看懂,达人解释一下),一个就是可以更方便地调用IronPython or IronRuby的类,最后就是能更方便地使用反射创建实例和调用方法。

 

针对作者提出的两个问题对dynamic进行理解。

◆写程序时少了智能感知

◆运行程序时速度变慢(反射)

看完New features in CSharp 4.docx才恍然明白,趁着没事,把东西整理一下,希望能对暂时还不明白dynamic有什么用的朋友提供一些参考。当然,由于本人才疏学浅,不保证所有的观点都是正确的,希望大家用辩证的眼光来看这篇文章,如有错误之处,请大伙批评指正。

言归正传,dynamic关键字用于声明一个动态对象,然后通过该动态对象去调用方法或读写属性。

在使用C# 2.0或3.0的时候,如果一个对象需要在运行时才能确定,并且没有接口和基类方面的信息,那我们一般使用反射技术来调用这个未知对像的方法或属性,而C# 4.0提供的dynamic可以帮我们简化这些工作。假设我们的程序会在运行时取得一个不确定类型的对象,但这个对象一定会有个Print()方法,我们需要调用这个方法打印出一些信息,那么在C# 4.0下面,我们可以用下面的两句代码来实现这个需求。

dynamic unknowObj = GetDymanicObject();
unknowObj.Print();  //调用动态对象的某个方法

这种解决方式比起用反射调用Print方法,应该简洁很多吧?程序员要做的就是别把方法名Print()打错,VS2010是不会为dynamic对象提供智能提示的,因为VS不知道运行时这个unknowObj会是什么东东……

到这里,应该有不少的朋友可以从这个例子上看出,当程序编译到unknowObj.Print()的时候,VS会帮我们生成反射的代码,用反射的方式去调用Print这个方法,实质上就是帮我们自动反射了。

如果能理解这一点,那也就不难理解C#为啥要搞dynamic这个既没智能感知,运行又慢的怪物出来了。

按New features in CSharp 4的说法,dymanic主要应用于下面的场景:

1、自动反射

2、COM组件互操作

3、混合编程,例如IronRuby和IronPython

4、处理Html DOM对象

如果有处理过上面这些工作的朋友们,应该不难理解了吧。

具体的内容,还请大伙自己看看New features in CSharp 4,里面说得比较详细。

你可能感兴趣的:(C#4.0动态语言)