dynamic与var(转)

【C#4.0】中的dynamic与var的区别


注意:var与dynamic这两个关键字,只是看起来很相
似,仅此而已!

var表示“变量的类型是在编译时决定的”,但是dynamic
示“变量的类型是在运行时决定的”。因此,dynamicvar具有截然不同的含义。
var
你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型。dynamic更厉害,它告诉编译器,根本就别理究竟是啥类型,运行
时再推断不迟。
var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参
数类型定义成vardynamic就没有这些局限了。
dynamic类型并没有跳过类型校验,只是
延迟到了运行时。如果在运行时,检测到类型不兼容,照样会抛出异常。


你可能在以下情况下使用dynamic
1.COM对象
2.动态语言(如IronPython,IronRuby等)对象
3.反射对象
4.C#
4.0中动态创建的对象


    
提到dynamic,我首先想到的是var关键字。事实上,当var在C#3.0中刚刚出现的时候就引起了一些人的质疑,后来微软解释var只是隐含类型声明符,并且只能用作局部变量,它其实仍然是强类型,只不过是编译器由初始化结果推断而来,所以对这个变量仍然可以可以使用VS的只能提示。现在dynamic则真正往动态特性迈进了一大步,根据Anders的解释,dynamic是指动态的静态类型,也就是说它本质上仍然是静态类型,只不过它告诉编译器忽略对它的静态类型检查,它会在运行时才进行类型检查,它可以应用在基本上所有的C#类型上面,如方法,操作符,索引器,属性,字段,它其实是通过统一的方式来调用方法、属性等操作。
    
dynamic主要用与需要与外界(COM,DLR,HTMLDOM,XML等)的交互的场合,在这些时候,你很可能不能确定这些对象的具体类型而仅仅知道它的一些属性,如方法等,因此这些时候你仅仅告诉编译器你需要在程序运行这里执行这些方法,至于操作对象是什么,你可能并不关心。这个时候,静态类型无法帮你解决问题,因为它们是在编译时就已经决定了的,反射虽然能做大,但毕竟太麻烦,而且效率较低。因此dynamic适时的出现了,它用编译时类型检查缺失的代价来实现让程序员看起来很干净的代码。dynamic的声明和使用很简单,跟javascript中的var基本是一致的。需要注意的是,在编译代码之前我们首先需要安装VS2010

Beta2或Visual C# Express 2010,我这里安装的是C# Express(注2)。


e.g.代码1:
class
Program{
static void main()
{
dynamic

a=7;
a.Error=”Error”;
a=”Test”;
a.Run();
}
}

这段代码可以通过编译,但无法运行。C#编译器允许你对a对象调用任何?......


COM互操作性

C# 4.0包含了多个特性,改进了与传统COM
API接口如Office自动化等的互操作性。Dynamic类型、命名参数以及可选参数也属于改进中的一部分。

许多的COM方法允许其参数和返回值类型为object,因此对于强类型语言如C#来说,就需要做大量的强制类型转换。然而在C#
4.0中,如果在编译时加上/link选项,则dynamic类型就会起新的效果:它使得COM接口方法签名中的object类型(参数类型或返回类型)被视为dynamic,因而能够避免大量的类型转换工作。例如,下面的语句对此进行了对比。

// 没有用 dynamic.

((Excel.Range)excel.Cells[1, 1]).Value2 = "Name";

Excel.Range range = (Excel.Range)excel.Cells[1, 1];


// 用了dynamic,

excel.Cells[1, 1].Value = "Name";

Excel.Range range = excel.Cells[1, 1];





分类: C#
posted @ 2011-06-11 14:39  董雨  阅读(363)  评论(0编辑  收藏  举报