Freitag, 24. Januar 2014

Lambda Expressions nichts anderes als ein Kompilerschwindel?!

Lambda Ausdrücke hat wahrscheinlich jeder C# Entwickler lieben gelernt. Lang definierte Delegates gehören schon lange der Vergangenheit an. Aber was genau steckt eigentlich hinter diesen Lambda Expressions?

Eigentlich gar nichts so sehr besonderes. Der Compiler macht am Ende ganz normale Klassen- und Methodenaufrufe draus. Wer ab und an mal seine Assemblies decompiliert ist bestimmt auch schon mal auf die DisplayClass Klassen gestoßen. Diese sind mit dem CompilerGenerated Attribut versehen und dienen genau für unseren Zweck: Lambda Ausdrücke.

So wird aus folgendem Code:
 namespace LambdaSpike  
 {  
   public class ClassWithLambdaExpression  
   {  
     public ClassWithLambdaExpression()  
     {  
       var i = 3;  
       var foo = new Action(() => Console.Write("{0}: do something..", i));  
     }  
   }  
 }

Folgendes nachdem es der Compiler unter die Mangel genommen hat:
 public class ClassWithLambdaExpression  
 {  
   [CompilerGenerated]  
   private sealed class c__DisplayClass1  
   {  
     public int i;  
     public void b__0()  
     {  
       Console.Write("{0}: do something..", this.i);  
     }  
   }  
   public ClassWithLambdaExpression()  
   {  
     ClassWithLambdaExpression.c__DisplayClass1 c__DisplayClass = new ClassWithLambdaExpression.c__DisplayClass1();  
     c__DisplayClass.i = 3;  
     Action foo = new Action(c__DisplayClass.b__0);  
   }  
 }