正文
为什么有动态类型呢?
是因为很多东西天生就是动态类型的。
比如xml 和 json、cvs、数据库表,这些本来就是数据类型的。
在反射系列中提及到,为什么有发送呢? 是因为只有在运行的时候你才能知道他是什么类型。
同样的xml、json这些也是只有运行的时候才知道他有什么样的类型,当我们加载xml、json 映射成一个对象的时候,里面的属性也只有加载完后我们的程序才知道。
那这样就有一个问题啊,那就是加载的时候我们的程序才知道有这个属性,那么这种没法处理了吗?
这个时候人就介入了,比如json开发人员是知道有一个字段叫做fistname的,那么使用动态类型,可以是dynamicObj.fistname 这样获取就可以了。
动态获取属性的值,这似乎反射也可以做到啊。是的啊,当然反射可以做到,那有没有可能dynamic 就是反射获取字段值的语法糖呢?
这样就可以了:
static void Main(string[] args)
{
var type = typeof(String);
var chars = new char[] { '1','2','3','4','5','6'};
object x = Activator.CreateInstance(type, chars);
PropertyInfo property = type.GetProperty("Length");
var y = property.GetValue(x);
dynamic a = "123456";
var b = a.Length;
var c = "123456";
var d = c.Length;
Console.ReadKey();
}
我们来反编译看一下到底是怎么样的?
可以看到是这样的:
先看反射这块,反射这块好理解哈:
然后动态类型这块,其实原理还是反射了,先检查类型是否存在然后去调用。
那么看来呢,我好想也没有找到动态类型跳过检查这一块。
如果检查失败会报:runtime-binder.runtimebinderException。
反射和动态类型不同的是,反射是运行时候生成的检查,而动态类型是编译的时候生成的,这个根据上面应该好理解吧。
也就是说反射是可以跳过检查的,但是动态类型不行。
只是说一下,个人觉得其实也没什么关系。因为其实不怎么影响效率。该用动态类型就用动态类型,该用反射就用反射,两种的方向不一致。
通过上面il编译后的,我们发现根本就没有这个dynamic 这个东西,会编译成别的东西,起到了包装器的作用。
static void Main(string[] args)
{
dynamic a = "123456";
var t = a.GetType();
Console.WriteLine(t);
Console.ReadKey();
}
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293312.html