大家都知道这个是语法糖。毛主席告诉过我们,要顶住敌人糖衣炮弹个的进攻,so....

C#强调类型安全,所以弄不明白为什么会有个dynamic,var至少还在编译的时候进行类型检测,编译后帮我们转换成相应的类型。

dynamic编译后是变成object,但是它又不同于object:

dynamic dy="new string";
dy=1;
object ob="new string";
ob=1;
(他们说代码要着色,这个东西真的不好用,不是我不用)
毫无疑问,上面的代码编译后的结果如下:
object dy="new string";
dy=1;
object ob="new string";
ob=1;
接下来,加两行代码:
Console.WriteLine(dy);
Console.WriteLine(ob);
这个时候,两者的差别出现了,编译后:
Console.WriteLine(dynamic(dy));。。。。。。。。(1)
Console.WriteLine(ob);
对于dynamic,编译器会提醒后继者这个东西和我们之前的不一样,记得区别对待。
瞄了半天的IL,发现编译后的dynamic会预留一大堆的反射方法(应该是给运行时预留的),WriteLine委托给Action并Invoke(这里有一点不明白,Action委托的in只能是类型
这里又是怎么把动态的类型加载进去的?
为了验证,写了下面几个方法:
Action<int> printInt=Console.WriteLine;
printInt(dy);。。。。(2)
printInt.Invoke(dy);。。。。。(3)
Type tp=dy.GetType();
tp.GetMethod("WriteLine", new Type[] { dy.GetType() }).Invoke(null,new object[]{dy});。。。。(4)
通过对IL的对比,我得出了以下结论:
1、我的头晕了
2、(1)、(2)、(3)、(4)实现的机制类型,都是一大堆的反射(废话啊)
3、(3)和(1)的代码最近,但是(3)规定了dy的类型。
4、(4)和(1)的参数类型是一样的,而且去除委托后的实现也相近。
最后,还是一句废话,平常没事想要方便的话还是用var吧,效率高,又有智能感知(这是非常非常有爱的)。dynamic??陋习!
这个有问题

作者: 菜鸟老了 发表于 2011-07-21 09:53 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"