原文链接 ; http://blog.csdn.net/shanyongxu/article/details/47296033

dynamic类型

C#新增了dynamic关键字,正是因为这一个小小的关键字,C#像前迈进了一大步.

dynamic是一个类型关键,声明为dynamic的类型与”静态类型”(这里的静态是指编译时确定的类型,例如int,double类型)相比最大的特定它是”动态类型”,它会在运行时尝试调用方法,这些方法的存在与否不是编译时期检查的,而是在运行时查找,如果方法存在并且参数正确,会正确调用,否则会抛出异常.

案例:

dynamic d = Console.Out;

dynamic a;

a = new Int32();

int b = a;

a++;

a--;

//这是东西不会有自动补全,因为必须在运行的时候才能检查方法的正确性

d.WriteLine("hello,world");

//所以大小写全靠自己

d.WriteLine(d.GetType());

//d.writeline();在运行的时候会抛出异常

对dynamic类型的操作只能有以下几种:

1.赋值

2.方法调用

3.自增,自减

4.接受”静态类型”的构造器创建的对象

与关键字var比较

从表面上看,dynamic与var关键字的用法很像,但实质上有本质区别.

var关键字被称为:隐含类型局部变量(Local Variable Type Inference),var只能用作局部变量,不能用于字段,参数;声明的同时必须初始化;初始化时类型就已经确定了,并且不能再被赋值不能进行隐式类型转换的类型的数据;编译时编译器会对var定义的变量进行类型推断,这时变量的类型已经确定.

dynamic可用于类型的字段,方法参数,方法返回值,可用于泛型的类型参数等;可以赋值给或被赋值任何类型并且不需要显式的强制类型转换,因为这些是运行时执行的,这要得益于dynamic类型的动态特性.

与反射的比较

首先能看到的是,dynamic与反射相比,执行相同操作所需的代码少得多.

如调用类Me中的GetName()方法:

//用反射调用GetName()方法,这里需要使用命名空间System.Reflection

Assembly a = Assembly.GetExecutingAssembly();

object instance = a.CreateInstance("Xianfen.NET.TestDynamic.Me");

Type type = instance.GetType();

MethodInfo mi = type.GetMethod("GetName");

object result = mi.Invoke(instance, null);

同样的dynamic调用:

dynamic myInfo = new Me();

string result = myInfo.GetName();

dynamic类型与反射相比能进行的操作要少的多.

目前dynamic类型对属性调用是不可用的,但我们知道,属性生成IL时,对属性的读或者写会生成对象的在属性名前加上get_或set_前缀生成相应的方法,尝试调用两个方法来访问属性:

dynamic myInfo = new Me();

myInfo.set_Blog("hello,world");

string result = myInfo.get_Blog();

会抛出异常,提示找不到get/set_Blog方法,这点比较遗憾,同样,对有参属性的访问也是不行的.

反射还可以访问私有方法字段以及其他类型成员以及取得类型以及类型成员的信息等.

动态类型dynamic带给.net程序员的是更方便和快捷,为自己的程序书写带来了极大的便利.可到底怎么用?好不好用?效率高不高?这才是大家关注的.

var和dynamic简介

1.var简介:其实也就是弱化类型的定义,在代码编译时候确定类型

2.dynamic简介:动态类型,在代码运行的时候确定类型.

var和dynamic区别

1.var程序编译时确定类型,dynamic程序运行时确定类型

2.var只能定义局部变量,dynamic可定义局部变量和类变量.

var,dynamic,传统确定类型的效率对比

传统类型的效率>=var动态类型>dynamic动态类型

小小总结:

常有人会拿var和dynamic作比较,实际上,var和dynamic完全是两个概念,根本不应该放在一起比较.var实际上是编译期抛给我们的”语法糖”,一旦被编译,编译期会自动匹配var变量的实际类型,并用实际类型来替换该变量的声明,这看上去就好像我们在编码的时候用实际类型进行声明的.而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期.

这从VS的编辑器窗口就能看出来.以var声明的变量,支持”智能感知”,因为VS能推断出var类型的实际类型,而以dynamic声明的变量却不支持”智能感知”,因为编译器对其运行期的类型一无所知.对dynamic变量使用”智能感知”,会提示”此操作将在运行时解析”.

关于dynamic变量是一个object变量这一点,可以通过IL代码得到验证.当然,编译器也对dynamic声明进行了处理,以区别直接object变量.

dynamic是作为简化互操作性而被MSDN大肆渲染,大部分开发人员有个误解:因为很多开发人员不会接触COM+,OFFICE二次开发之类的编码,所以急需要一个dynamic的应用理由.那么在开发中dynamic很有价值的一点是:

dynamic可以简化反射.

反射的内容还没介绍,我也还没学到哪里,学到了反射,我在和大家一起交流!!

C#编程(七十)----------dynamic类型的更多相关文章

  1. Java编程思想(十五) —— 类型信息之反射

    讲完.class,Class之后,继续. 1)泛化的Class引用 Class也能够增加泛型,增加之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,尽管他们是等价的,C ...

  2. C#高级编程七十五天----C#使用指针

    在C#中使用指针的语法 假设想在C#中使用指针,首先对项目进行过配置: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/font ...

  3. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档

    孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...

  6. 孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5

    孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  7. CUDA编程(十)使用Kahan&#39;s Summation Formula提高精度

    CUDA编程(十) 使用Kahan's Summation Formula提高精度 上一次我们准备去并行一个矩阵乘法.然后我们在GPU上完毕了这个程序,当然是非常单纯的把任务分配给各个线程.也没有经过 ...

  8. 学习ASP.NET Core Blazor编程系列十——路由(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  9. C#编程总结 dynamic(转)

    介绍 Visual C# 2010 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像具有类型 object 一样 ...

随机推荐

  1. poj1292

    prim,把每个墙看成一个节点,从起点用prim求最小生成树,直到覆盖到终点为止,输出最小生成树中的最大边 #include <cstdio> #include <cmath> ...

  2. Kali Linux没有声音的解决方法

    Kali Linux系统默认状态下,root用户是无法使用声卡的,也就没有声音.启用的方法如下:         (1)在终端执行命令:systemctl --user enable pulseaud ...

  3. (转)js函数前加分号和感叹号是什么意思?有什么用?

    转载地址:https://www.cnblogs.com/mq0036/p/4605255.html 一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuer ...

  4. 神奇的Content-Type--在JSON中玩转XXE攻击

    转自:360安全播报http://bobao.360.cn/learning/detail/360.html 大家都知道,许多WEB和移动应用都依赖于Client-Server的WEB通信交互服务.而 ...

  5. Vue学习系列---安装

    一.前言 学任何东西都是有理由的,目前主要有Angular,React,Vue这三个前端MVVM框架.我选择vue原因很简单,“”入门简单“”,是的只是这个理由.相较于其他2个框架,vue的文档真的是 ...

  6. django中的view测试和models测试样例

    感觉用model_mommy比factory_boy要好些. 如果Models.py如下: from django.db import models from django.contrib.auth. ...

  7. Hive的安装和使用

    1.Hive1.1 在hadoop生态圈中属于数据仓库的角色.他能够管理hadoop中的数据,同时可以查询hadoop中的数据. 本质上讲,hive是一个SQL解析引擎.Hive可以把SQL查询转换为 ...

  8. Going Home

    题意:n个人,进n个房子,每走一格花费1美元,每个房子只能进一人,求所有人进房子的最小花费.   就是推箱子 箱子最短行走距离 这题无法用bfs做 ! 用最小花费最大流 通过EK,Dinic,ISAP ...

  9. java 的反射机制

    一:介绍 1.大纲 #1 允许程序在执行期间,调用反射API取得任何类的内部信息,并且可以直接操作任何对象的内部属性和方法. #2 学习反射,需要掌握的知识点: *实例化class类 *获取类的完整结 ...

  10. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...