(转载)【C#4.0】dynamic和var及object

dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType());spa

此段代码会输出 System.Int32,第二行不须要类型转换,由于在运行时识别类型。dynamic 在后台使用 System.Object 类型。但与 object 不一样的是,动态类型不须要在编译时执行显式转换操做,由于它仅在运行时识别类型。关于dynamic和object的详细区别,看看《What is the difference between “dynamic” and “object” keywords?》.net

在 C# 类型系统中,dynamic 其实是一个静态类型,这个关键字使得C# 得到了动态功能,同时仍然做为静态类型化语言而存在。这句话如何理解,就要理解它是如何实现动态绑定的,看看《Dynamic Binding in C#4.0》插件

下面的代码会经过编译,但运行时报错。由于当您使用 dynamic 关键字时,您就告诉编译器关闭编译时检查。对象

 

dynamic a = "test"; a++;

来看看var关键字,从C#3.0开始加入的这个,咱们对JavaScript的var比较熟悉,看看C#的var:blog

 

var a = 10; a = a + 1; Console.WriteLine(a.GetType());

此段代码会输入 System.Int32, 第二行不须要类型转换,var是强类型的。当使用 var 关键字声明变量时,将在编译时根据初始化字符串推断该变量的类型。 在运行时没法更改该变量的类型。ip

但要注意的是,var 关键字不过是一个指令,它让编译器根据变量的初始化表达式推断类型;var 不是类型。字符串

最后看看object,关键字 object 表示 System.Object 类型,它是 C# 类层次结构中的根类型。 此关键字常常在编译时没法肯定对象类型时使用,而这种状况常常在各类互操做性情形中发生。get

但用object要避免类型转换(显式或隐式)编译器

 

object a = 10; a = (int)a + 10; a = "test";

Dynamic能够用来干吗?it

发挥你的想象力,我能够想到的是能够用来作脚本支持,好比office支持用vba脚本写插件,那咱们也能够用这个实现可编写脚本的应用。

第二个用处就是用动态方法包,动态方法包就是可在运行时添加和删除属性及方法的对象。System.Dynamic命名空间其实是 DLR 的一部分,能够用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 类与新的 dynamic 关键字相结合实现本身须要的东东。

第三个用处是替代反射。有个例子,经过反射调用一个计算器对象的Add方法,先前不知道计算器的类型,只知道有个Add方法,代码是这样的:

 

object calc = GetCalculator(); Type calcType = calc.GetType(); object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 }); int sum = Convert.ToInt32(res);

如今不用反射用dynamic就代码简洁了:

 

dynamic calc = GetCalculator(); int sum = calc.Add(10, 20);

这样看来Dynamic仍是挺有意思的。

 

var与dynamic这两个关键字,只是看起来很类似,仅此而已!
var
表示“变量的类型是在编译时决定的”,可是dynamic表 示“变量的类型是在运行时决定的”。所以,dynamicvar具备大相径庭的含义。
var让 你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型。dynamic更厉害,它告诉编译器,根本就别理到底是啥类型,运行 时再推断不迟。
var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参 数类型定义成vardynamic就没有这些局限了。
dynamic类型并无跳过类型校验,只是 延迟到了运行时。若是在运行时,检测到类型不兼容,照样会抛出异常。

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

 

转自:http://blog.csdn.net/it_xiaohong/article/details/7249277

相关文章
相关标签/搜索