Anthan @ cnblogs
向左走,向右走

      最近事情不多,闲来无事突然发现与其盲目追寻新技术,不如温故,而且本人从1.1到2.0的过程太过仓促,实际工作中还是在用1.1的方法写2.0的代码,虽然无错,只是失去了它本身的意义了。于是就又翻起书重新整理这部分的知识。本着做笔记的思路写这些东西,对自己而非别人,如果有兴趣或者有想法希望不吝赐教。

      闲话休叙,第一回先写匿名方法。相信大多数人和我一样我了解这个概念是在Java中,只是悔恨当时在学校Java就为了混个学分,现在想来,悔之晚矣啊。从见名知意的角度来看这个名词应该很容易理解,但是要真正完全的理解它的意思恐怕就不是那么简单。

      匿名方法概述

      匿名方法产生的历史背景相信就不需要多说了,1.X中事件模型采用委托来实现事件方法的模型现在看来的确是有点冗长而繁杂,如果能够将委托与实际处理方法代码集中在一起那么整个程序的实用性,方便性都降得到提升。匿名方法允许将与一个委托关联的代码内联到具体使用委托的地方,这样委托和方法实体集中在一起,更重要的是匿名方法能够共享本地语句所饱汗函数成员的访问。

      匿名方法简单示例

       如上简单所示,匿名方法添加了一个参数列表,其参数sender在匿名方法和EventHandler委托类型之间发生了一个隐式转换,只有参数列表和返回值类型都兼容的时候才会发生匿名类型向委托类型的隐式转换。兼容规则就不赘述了。
      编译器会自动根据上下文推断匿名方法对应的委托类型,很明显,前一句会让编译出错。
//未执行显示转换
Delegate objD = delegate this.Alert("Hello World!"); };
//执行了显示转换
Delegate objD=(EventHandler)delegate this.Alert("Hello World!"); };

      匿名方法运行机制

      匿名方法完全是有编译器在编译时实现,并没有改变CLR委托本身的运行机制。匿名方法的执行实际上是将其进行转换的过程。当编译器检测到有匿名方法定义时,会自动根据情况生成静态方法,实例方法或者内部类似包装匿名方法的代码,并自动创建相应的委托实例。

     下面分三种情况来阐述匿名方法的运行机制

     1.匿名方法没有引用任何外部变量时编译器生成一个静态方法来包装匿名方法。

     2.匿名方法中只引用到定义这个匿名方法的实例的变量或者属性,则编译器生成一个实例方法来包装匿名方法。

     3.匿名方法引用了方法外部的局部变量或者参数。如果匿名方法引用了外部的局部变量或参数,则改外部局部变量的生存周期被延长到引用匿名方法的委托可以被垃圾回收为止。1.1中,局部变量和参数是完全对应于CLR模型的。而在这个地方,为了实现匿名方法中使用变量的完整性,2.0使用的模型开始变得并不是完全对应CLR模型。如果方法内定义了匿名方法,则这个方法的局部变量和参数就会映射到编译器生成的匿名对象的实例域上。这块理解起来有点难度,自己总是无法构建出来很准确的实例程序来理解这个问题,希望高手指点一二。

     到这里匿名函数的运行机制让我不禁想起C++中的Inline函数,似乎和上面所说的刚好相反,Inline函数是把函数拆开,把函数体插入到相应的调用它的地方以提高调用的效率,这里的疑问是如果和Inline相反操作的话是否会增大编译开销进而影响运行时的效率,希望高手指点...    

     匿名方法的运行机制还不是特别清楚,因为没有在实际开发中用过的东西感觉总是很朦胧,所以需要进一步的去实践并熟悉它。也许是因为不够熟悉的原因吧总觉得匿名方法的可读性比较低,也许这就是鱼和熊掌的矛盾吧。

.Net2.0 New Feature to be continute......

posted on 2007-05-30 10:19  Anthan  阅读(552)  评论(2编辑  收藏  举报

Copyright © 2006-2007 Anthan All Rights Reserved.