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

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

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

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

dynamic a = "test"; a++;

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

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

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

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

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

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

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

Dynamic可以用来干嘛?

发挥你的想象力,我可以想到的是可以用来做脚本支持,比如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

(转载)【C#4.0】dynamic和var及object的更多相关文章

  1. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

    阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...

  2. 弱类型dynamic与var

    dynamic与var都可代替任何类型 var关键字是C# 3.0开始新增的特性,称为推断类型. 1.必须在定义时初始化 2.一但初始化完成就不能再给变量赋与初始化值类型不同的值 3.var要求是局部 ...

  3. dynamic和var的区别

    1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数. 3.表达式不能转型为 ...

  4. 转载:as3.0下对象类型返回值与变量默认值的详细说明

    转自:http://www.cuplayer.com/player/PlayerCodeAs/2012/0905367.html Null.NaN.undefined 及各自应用对象:变量的默认值: ...

  5. (转载)Android 3.0动画学习笔记

    转自http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html.该文章是本人见过关于Android 动画较为优秀的文章,多次查阅 ...

  6. dynamic与var

    dynamic与var示例 var是一种语法省略写法,编译器会根据上下文推断出正确的类型. , , , , , , , }; foreach (var item in scores) { Consol ...

  7. C# dynamic与var的区别

    1.C#编程总结(十四)dynamic 2.var和dynamic的区别及如何正确使用dynamic?

  8. 论文笔记:Learning Dynamic Memory Networks for Object Tracking

    Learning Dynamic Memory Networks for Object Tracking  ECCV 2018Updated on 2018-08-05 16:36:30 Paper: ...

  9. [转]理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

    阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...

随机推荐

  1. Android 解决qq分享后返回程序出现的Bug

    问题:当我们使用qq分享时,分享成功后选择留在qq,这个时候按home键,回到手机主界面,在点击回到我的app,这个时候会出现界面显示出来了,但是任何事件都不响应,即按钮没反应. 分析:这个时候回到我 ...

  2. 算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)

    目录 1 问题描述 2 解决方案 2.1 第一印象解法(80分) 2.2 借鉴网友解法(100分)   1 问题描述 问题描述 右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有 ...

  3. list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址

    #define list_entry(ptr, type, member) \ ((type *)(() -> member))) 解释: 1 在0这个地址看做有一个虚拟的type类型的变量,那 ...

  4. Struts2简介以及结果集转发

    一.分析之前的项目的不足,编写属于自己的框架二.Struts2简介(面试)三.搭建Struts2的开发环境 1.找到所需的jar包:发行包的lib目录中(不同版本需要的最小jar包是不同的,参见不同版 ...

  5. WPF SL 属性生成器

    在开发WPF 和SL应用的时候通用会用到MVVM模式,每次写到类属性的时候要不断的写属性更新时通知方法,写多了就嫌烦,就手写了个属性生成工具,在属性更新的时候添加了更新通知方法. 工具中支持自定义类对 ...

  6. 在做和sap系统集成的一点心得

    最这一个月和sap做集成,把主数据中的数据写入到sap系统中,做集成就离不开联调,平时开发中,一个复杂点的系统还容易出问题,涉及到两个系统,由于两个或多个系统来自不同的厂家,各个厂家的开发对业务的理解 ...

  7. 阿里云slb实现多域名https

    刚开始接锅,没注意原来站点的https配置在slb上,在服务器上配置一顿操作猛如虎,细细检查一遍,感觉良好,一测试发现不对劲,检查发现原来https配置在阿里云slb上,阿里云还是做得不错的 ,但是现 ...

  8. 多线程-AbstractQueuedSynchronizer(AQS)

    概述 从使用者的角度,AQS的功能可分为两类:独占功能和共享功能.它的子类中,要么实现并使用了它独占功能的API,要么使用了共享锁的功能,而不会同时使用两套API,即使是它的子类ReentrantRe ...

  9. atitit.React   优缺点 相比angular react是最靠谱的web ui组件化方案了

    atitit.React   优缺点 相比angular react是最靠谱的web ui组件化方案了 1. React的组件化才是web ui部件的正确方向1 1.1. 组件化集成html ,css ...

  10. SVN使用(自己总结)

    1.第一次导入,注意要新建个readme.txt文件用于记录版本更改,每次导入时 要填写import message 2.第二次增加文件导入时 勾选未受控版本文件(新增加文件) 完成上传就可更新增加的 ...