c# dynamic关键字以及优势和劣势、类型转换以及Dictionary之间的转换 | 您所在的位置:网站首页 › dynamic怎么读 › c# dynamic关键字以及优势和劣势、类型转换以及Dictionary之间的转换 |
dynamic 是动态类型,在编译阶段把它当做object 类型(以应付编译器的类型检查),在运行阶段再进行类型检查,(C# 、java 编程语言是静态类型语言,javaScript、python 是动态类型语言,动态类型语言在编译阶段是不进行类型检查的),因此C#静态类型语言既具备静态语音的特性又具备动态语言的灵活,不得不说这是C#的进步。环境: dynamic 关键字和动态语言运行时 是.net4.0 新增的功能区分: dynamic 和var、object的区别 ,
var 其实是编译器的语法糖,在编译器编译的时候会自动替换成真正的类型 。例如:var p = new Person() 编译器编译后 Person p = new Person。而 dynamic 在编译的时候被当做object 类型对待,以应付编译器的类型检查。dynamic在运行的运行阶段进行类型检查。例如 dynamic str="abc"; string str = "123"; int number= str; (编译器不会检测到此错误,在运行的时候才会报 隐式转换(implicitly Convert) 错误) int number = str;(编译器在编译的时候就不检测到此错误(无法将类型string 隐式转换成int))虽然dynamic 在编译阶段被当做 objec 类型,但是它和object还是存在区别的, dynamic 可以直接进行类型转换,而object则不行。 例如 : dynamic nd= 123; int val = nd;(无论在编译还是在运行都是没有问题的) objetct obj = 123; int count = obj; (编译器肯定会报类型转换错误,必须用Convert.int() 等类型装换函数进行强转)
4. 优点: 满足程序在运行的时创建对象的需求,而不需要提前定义一个类然后再对该类进行实例化。类型转换简单,可以直接进行类型转换,而不需要使用 类型转换函数(Convert, tryPase)进行转换可以动态的为类型添加字段属性。给程序的扩展带来的方便(例如我定义了一个函数 该函数功能是用dapper 查询不同基础信息表并返回不同表的实体对象。但由于 项目开发的过程中可能根据项目的复杂度不断的添加其他基础信息表,为了在不变动程序的前提下,实现该功能 ,dynamic 便成了唯一的选择)5.缺点: 没有类型检查容易造成类型转换错误。6 .dynamic 和Dictionary ,dynamic 实现是借助于IDictionary, 所有的字段信息都保存到一个Dictionary集合里,key 是string类型,value 是 object 类型,所以dynamic 可以和Dictionary 进行类型转换 dynamic 转换成Dictionary dynamic data = new Person(); IDictionary dic =data as IDictionary; Dictionary 可以转换成dynamic for(KeyValuePair item in dic) { ((IDictionary )data).add(item.key,item.value); }
7.dynimic 使反射更加简单,如下 //dynamic 的实现 dynamic p = Activator.CreateInstance(typeof(person)); p.talk("muse"); //反射 var p1 = new person(); var takdMethod = typeof(person).GetMethod("talk"); takdMethod.Invoke(p1,new object[] { "kitty"});
|
CopyRight 2018-2019 实验室设备网 版权所有 |