| 加入收藏| 设为首页| 联系我们
深入理解C# 3.0的新特性(3):从Delegate、Anonymous Method到Lambda Expression
http://www.domcn.org 文章来源:本站收藏 点击数:
nonymousMethodDelegate1;[CompilerGenerated]private static bool <Main>b__0(int args){ return (args > 0);}我们进一步来看看Main Method的IL。 .method private hidebysig static void Main() cil managed{ .entrypoint // Code size 43 (0x2b) .maxstack 3 .locals init ([0] class Artech.LambdaExpression.Function`2<int32,bool> function3) IL_0000: nop IL_0001: ldsfld class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::<>9__CachedAnonymousMethodDelegate1 IL_0006: brtrue.s IL_001b IL_0008: ldnull IL_0009: ldftn bool Artech.LambdaExpression.Program::<Main>b__0(int32) IL_000f: newobj instance void class Artech.LambdaExpression.Function`2<int32,bool>::.ctor(object, native int) IL_0014: stsfld class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::<>9__CachedAnonymousMethodDelegate1 IL_0019: br.s IL_001b IL_001b: ldsfld class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::<>9__CachedAnonymousMethodDelegate1 IL_0020: stloc.0 IL_0021: ldloc.0 IL_0022: ldc.i4.s 20 IL_0024: callvirt instance !1 class Artech.LambdaExpression.Function`2<int32,bool>::Invoke(!0) IL_0029: pop IL_002a: ret} // end of method Program::Main 和上面通过Anonymous Method Delegate实现的时候完全是一样的。四、Conclusion 现在我们可以得出结论了,Lambda Expression本质上是一个Anonymous Method Delegate,这个Delegate的匿名性仅仅针对Programming language而言,编译器会为它生成一个Named delegate和一个它指向的Method。这个两个额外生成的对象作为使用Anonymous Method Delegate对应的Class的Static Method而存在。从本质上讲和一般的Delegate并没有本质的区别。所以上面我们分别通过Named delegate、Anonymous method delegate和Lambda Expression实现的3个方式是等效的。上一页 [1] [2] [3] [4]
和上面通过Anonymous Method Delegate实现的时候完全是一样的。四、Conclusion
现在我们可以得出结论了,Lambda Expression本质上是一个Anonymous Method Delegate,这个Delegate的匿名性仅仅针对Programming language而言,编译器会为它生成一个Named delegate和一个它指向的Method。这个两个额外生成的对象作为使用Anonymous Method Delegate对应的Class的Static Method而存在。从本质上讲和一般的Delegate并没有本质的区别。所以上面我们分别通过Named delegate、Anonymous method delegate和Lambda Expression实现的3个方式是等效的。
上一页 [1] [2] [3] [4]