http://www.cnblogs.com/yank/p/4177619.html

C#编程总结(十四)dynamic

介绍

Visual C# 2010 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。 因此,您不必考虑对象是从 COM API、从动态语言(例如 IronPython)、从 HTML 文档对象模型 (DOM)、从反射还是从程序中的其他位置获取自己的值。 但是,如果代码无效,则在运行时会捕获到错误。

var与dynamic对比

1、var编译时替换为实际类型,而dynamic实际是object类型。

一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

2、智能感知。

以var声明的变量,支持“智能感知”,因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持“智能感知”,因为编译器对其运行期的类型一无所知。对dynamic变量使用“智能感知”,会提示“此操作将在运行时解析”。

简单案例

编写一个hello world的测试程序,定义DynamicTest类型,并增加Welcome方法,其参数为name.

然后创建dynamic对象,调用Welcome方法。参数为空。

using System;namespace DynamicSample
{class Program{static void Main(string[] args){dynamic obj = new DynamicTest();obj.Welcome();}}class DynamicTest{public void Welcome(string name){Console.WriteLine("Hello {0},welcome to dynamic world.",name);}}
}

看看发生什么事情呢,通过测试发现:

编译通过,没有任何异常。

运行时抛出异常,异常信息:

未处理Microsoft.CSharp.RuntimeBinder.RuntimeBinderExceptionHResult=-2146233088Message=“Welcome”方法没有采用“0”个参数的重载Source=Anonymously Hosted DynamicMethods AssemblyStackTrace:在 CallSite.Target(Closure , CallSite , Object )在 System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1[T0](CallSite site, T0 arg0)在 DynamicSample.Program.Main(String[] args) 位置 E:\Donet\C#\DynamicSample\DynamicSample\Program.cs:行号 13在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)在 System.Threading.ThreadHelper.ThreadStart()InnerException: 

修正后:

    class Program{static void Main(string[] args){dynamic obj = new DynamicTest();string name = "Tom";obj.Welcome(name);Console.WriteLine("Input any key to exit.");Console.ReadKey();}}

运行结果:

如果改为var,定义该对象,并调用方法,代码如下,编译器会报错:

            var v1 = new DynamicTest();v1.Welcome();

错误信息:

    错误    CS7036    未提供与“DynamicTest.Welcome(string)”的必需形参“name”对应的实参    DynamicSample    Program.cs    15错误    CS7036    There is no argument given that corresponds to the required formal parameter 'name' of 'DynamicTest.Welcome(string)'    DynamicSample    

dynamic应用范围

1、在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型,都可以使用dynamic。

2、在显式类型转换中,作为转换的目标类型。任何对象都可以隐式转为dynamic。

3、在以类型充当值(如 is 运算符或 as 运算符右侧)或者作为 typeof 的参数成为构造类型的一部分的任何上下文中。

通过一个实例来具体说明:

    class DynamicUser{/// <summary>/// 字段/// </summary>public dynamic userid;/// <summary>/// 属性/// </summary>public dynamic UserName { get; set; }/// <summary>/// 玩游戏/// (dynamic可以作为参数、返回值等)/// </summary>/// <param name="game"></param>/// <returns></returns>public dynamic Play(dynamic game){dynamic defaultGame = "Play Basketball.";dynamic secGame = "Play with mud.";if (game is int){return defaultGame;}else{return secGame;}}/// <summary>/// 显式类型转换/// </summary>public void ConvertToDynamic(object obj){dynamic d;d = (dynamic)obj;Console.WriteLine(d);}/// <summary>/// 类型判定/// (dynamic 可以使用is、as、typeof)/// </summary>public void TypeCheck(){int age = 20;Console.WriteLine("Age is Dynamic? {0}",age is dynamic);dynamic d = age as dynamic;Console.WriteLine("Age:{0}",d);         Console.WriteLine("List<dynamic>'s type is {0}",typeof(List<dynamic>));}}

测试用例:

            DynamicUser user = new DynamicUser();user.userid = 123;user.UserName = "Lucy";user.ConvertToDynamic(user.userid);user.ConvertToDynamic(user.UserName);user.TypeCheck();Console.WriteLine("Input any key to exit.");Console.ReadKey();

测试结果:

dynamic的执行效率

关于dynamic的效率问题,这里暂不展开,后续专门来讨论...

应用

1、自动反射

2、COM组件互操作

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

4、处理Html DOM对象

5、还有一种应用,数据传输中格式转换,如:对象转json等,很方便

C#编程总结(十四)dynamic相关推荐

  1. JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快!

    JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快! 一.ReentrantReadWriteLock(读写锁) 1.读写锁存在 ...

  2. CSDN 编程竞赛十四期题解

    竞赛总览 CSDN编程竞赛十四期:比赛详情 (csdn.net) 本次竞赛题目难度适中,并且题目的解法(思路)也比较多,很适合新人学习. 竞赛题解 题目1.字符串全排列 对K个不同字符的全排列组成的数 ...

  3. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...

    第十四章 设计Shell集成应用 有一些工具可以使应用程序更紧密地与Shell和底层系统进行集成.也就是说,用户可以象处理系统文档和程序那样处理你的文档和程序.例如,右击文件来显示可用功能列表等.Wi ...

  4. Python界面编程第十四课:Pyside2 (Qt For Python)使用Calendar创建日历

    QCalendar 是什么? QCalendar对象使用特定系统规则将年.月和日映射到特定的日期(最终由它的Julian天数标识). 默认的QCalendar() 是一个扩展的Gregorian日历, ...

  5. 牛客网力扣算法编程之十四 | 字符串 - 字符个数统计 - Java代码实现

    [算法编程]字符个数统计 一. 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里.不在范围 ...

  6. C#高级编程五十四天----Lookup类和有序字典

    Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...

  7. Java并发编程(十四)并发容器类

    同步容器将所有对容器状态的访问都串行化,以实现线程安全性.这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低. 另一个方面,并发容器是针对多个线程并发访问设计的.在java 5 ...

  8. Windows核心编程 第十四章 虚拟内存

    第1 4章 虚 拟 内 存 <这一章没啥,是说的几个内存相关的函数 > 14.1 系统信息 许多操作系统的值是根据主机而定的,比如页面的大小,分配粒度的大小等.这些值决不应该用硬编码的形式 ...

  9. c++面向对象高级编程 学习十四 引用

    文章目录 reference reference的常见用途 reference 变量有三种形式:值,指针,引用 int x=0; //值 int* p=&x;//指向整型的指针,地址,指针在之 ...

  10. cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...

    一. CMDB后台管理 CMDB管理主要分为采集资产.API接口.后台管理.这里主要介绍CMDB后台管理. - 采集资产 - API - 后台管理- 资产列表- 业务线列表- 用户列表- 组列表... ...

最新文章

  1. 深入浅出的“深拷贝与浅拷贝”
  2. ListView和RecyclerView的Adapter封装
  3. Python 基础 函数
  4. 深入探讨 java.lang.ref 包--转
  5. python列表索引超出范围 等于啥_python中的“列表索引超出范围”
  6. java代码简单操作Redis数据Jedis jar
  7. iOS开发时间戳与时间,时区的转换,汉字与UTF8,16进制的转换
  8. localsandbox 如何响应tile点击事件
  9. 交换两个数字的三种方式
  10. python读写文件操作_详解Python文件读写操作
  11. abp框架(aspnetboilerplate)设置前端报错显示
  12. 【转】自学成才秘籍!机器学习深度学习经典资料汇总
  13. 开万人 AI 大会什么感受?陆奇任大会主席 | AI ProCon 2020
  14. python sleep什么意思,Python sleep()
  15. Unity3D脚本编程读书笔记——第2章 Mono脚本核心基础
  16. 李子奈计量经济学笔记和课后习题答案
  17. 嵌入式学习——使用STM32F103基于HAL库移植uCOS-III
  18. 等额本息和等额本金实现步骤
  19. 概率论复习用 更新中
  20. 网络攻防原理与技术 第一章 课后题

热门文章

  1. 如何用命令行启动mysql_命令行方式启动mysql 如何用命令行启动mysql
  2. win10输入法设置在哪里?对于输入法设置的图文教程
  3. Debian cinnamon 搜狗输入法
  4. Node.js实现MySQL数据库连接池
  5. CSS_如何设置滚动条样式_超出左右滚动
  6. Python反编译pyinstaller或py2exe生成的exe可执行文件,获得源码
  7. SQL:SQL 指令大全
  8. Flutter实战 | 从 0 搭建「网易云音乐」APP(五、播放功能逻辑)
  9. 软件系统设计-20-往年考试题
  10. 三行情书计算机系,【全国高校三行情书大赛官网】_全国高校三行情书大赛作品...