原文链接 ; 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. 08 Go 1.8 Release Notes

    Go 1.8 Release Notes Introduction to Go 1.8 Changes to the language Ports Known Issues Tools Assembl ...

  2. spring boot JPA中实体类常用注解

    spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...

  3. css-通过hover实现鼠标进过背景色变化

     通过hover实现鼠标进过背景色变化 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  4. About Saliency Object Detection

    显著性对象检测综述 详见:http://mmcheng.net/zh/paperreading/ 一.    程明明等人的论文:Salient Object Detection: A Survey(简 ...

  5. Orchard学习 01、orchard日志

    一.日志模块类图 1.ILogger接口及实现 2.ILoggerFactory接口及实现 3.其他 二.NullLogger类型     NullLogger类型是实现ILogger接口的空类型.它 ...

  6. jupyter安装,修改登录密码,启动

    jupyter安装,修改登录密码,启动     1.安装jupyter: pip install jupyter     (如果报错) pip install jupyter notebook   2 ...

  7. P2398 GCD SUM

    P2398 GCD SUM一开始是憨打表,后来发现打多了,超过代码长度了.缩小之后是30分,和暴力一样.正解是,用f[k]表示gcd为k的一共有多少对.ans=sigma k(1->n) k*f ...

  8. Java 内存模型 ,一篇就够了!

    Java 虚拟机   我们都知道 Java 语言的可以跨平台的,这其中的核心是因为存在 Java 虚拟机这个玩意.虚拟机,顾名思义就是虚拟的机器,这不是真实存在的硬件,但是却可以和不同的底层平台进行交 ...

  9. Eclipse设置之:代码注释/server 控制台输出乱码解决

    1           Eclipse设置 Configure clean up style The location is here: And the configuration should fo ...

  10. android 设置为系统应用

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 将一个应用apk放到手机的 /系统/应用  这个目录下, 就会是 系统应用.