继续瞎掰:dynamic

大家都知道这个是语法糖。毛主席告诉过我们,要顶住敌人糖衣炮弹个的进攻,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??
这个有问题
posted on 2011-07-21 09:53  菜鸟老了  阅读(1183)  评论(14编辑  收藏  举报