匿名方法
匿名方法基础
匿名方法总是以一个delegate关键字开始,后面跟着用在方法和方法体本身中的参数。
机制:当你在一个类的代码中写匿名方法并编译这个代码时,C#编译器默默地在你定义匿名方法的相同的类中创建了一个静态或实例private方法。所以匿名方法只是一个在类中定义你自己方法以传递到委托的方便的语法。
编译器决定如何创建静态方法或实例方法取决于匿名方法被定义的类中的静态或实例数据成员的用法。
匿名方法的静态数据成员的用法
1. 如果没有用到类里的数据成员,或者使用了用匿名方法所在类的任何静态数据,C#编译器将在类里创建一个static方法来包装匿名方法。
匿名方法的实例数据成员的用法
2. 如果匿名方法使用了实例的数据成员。当编译时,C#编译器将创建一个private实例方法来包装匿名方法。C#编译器必须创建一个实例方法因为该方法需要访问当前类的实例数据成员。
3. 当C#编译器在一个匿名方法的方法体中识别出用到一个局部变量,它就会做如下事情:
a) 创建一个新的private类作为匿名方法被定义的类的一个内部类。
b) 在新类(即内部类)中创建一个公共数据成员,使用与用在匿名方法体中的局部变量相同的类型和名称。
c) 在包装匿名方法的新类中创建一个public实例方法。
d) 用新类中的声明替代局部变量的声明。创建该新类的一个实例代替局部变量的声明。
e) 用新类实例的数据成员替代在匿名方法体内部和外部使用的局部变量。
f) 用在新类中定义的实例方法的地址取代匿名方法的定义。
被用在匿名方法中的局部变量有着超出用到它们的外部常规方法的生命周期。这个技术,在其它语言中,就是大家都知道的闭包(closures)
产生的问题:
略