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);  
   }  
 }

Dienstag, 21. Januar 2014

Performance Schub im Visual Studio WPF Designer

Bei der Entwicklung von WPF Anwendungen kann einen der Designer im Visual Studio aufgrund der Performance schon mal zur Weißglut bringen. Eine kleine Änderung im XAML Code hat zur Folge, dass das komplette Projekt neu kompiliert wird. Das kann je nach Projektgröße unter Umständen mehrere Sekunden dauern.

Hat man einen Style bzw. einen Theme im XAML Code definiert, so wird dieser natürlich auch bei jeder Änderung im Designer mit kompiliert. Das kann je nach größe recht lange dauern.

Abhilfe kann dabei die Auslagerung des Styles schaffen. Legt man ein eigenes Projekt für diese Styles an, so muss dieser Code nicht jedes mal auf's neue kompiliert werden. Als weiteren Vorteil sehe ich die bessere Trennung zwischen den eigentlichen Views und deren Design.