2015-02-09 3 views
24

In einer neuen C# 6.0 können wir Methoden und Eigenschaften mit Lambda-Ausdrücke definieren.Ausdrucksbasierte Funktionselemente Effizienz und Leistung in C# 6.0

Zum Beispiel dieser Eigenschaft

public string Name { get { return First + " " + Last; } } 

kann nun wie folgt definiert werden:

public string Name => First + " " + Last; 

Die Informationen über die Expression-boided Funktionsmitglieder finden Sie hier: http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx

Weiß jemand, ob es Overhead bei der Verwendung neuer Syntax gibt? Kann es die Anwendung verlangsamen (oder die Effizienz verbessern) oder ist es vielleicht egal?

+10

Es ist nur Syntax Zucker, hat keinen Einfluss auf den generierten Code überhaupt. Verwenden Sie ildasm.exe, um sich selbst zu überzeugen. –

+1

Ich kenne diese Funktion nicht, aber ich bin ziemlich sicher, dass jeder syntaktische Zucker nur zum selben Code kompiliert wird. Es gibt also keinen Unterschied in der Laufzeitleistung. –

Antwort

53

In einem neuen C# 6.0 können wir Methoden und Eigenschaften mit Lambda-Ausdrücken definieren.

Nein, das geht nicht. Sie können Methoden- und Eigenschaftenkörper mit einer Syntax definieren, die wie ein Lambda-Ausdruck aussieht, indem sie das Token => verwendet.

Allerdings bedeutet dies nicht bedeuten, dass es einen Delegate-Typ beteiligt ist. (Während ein Lambda-Ausdruck nur in einem Kontext zulässig ist, in dem er in einen Ausdrucksbaum oder einen Delegattyp konvertiert wird.)

Dies ist reiner syntaktischer Zucker. Ihre zwei Beispiel-Code-Snippets werden auf die gleiche IL kompiliert. Es ist nur eine andere Art der Darstellung des Körpers einer Eigenschaft Getter oder Methode.

+0

Ist die Tatsache, dass sie auf die gleiche IL kompilieren garantiert oder ist es ein Implementierungsdetail? Zum Beispiel frage ich mich, ob ein Compiler in der Zukunft eine aggressive Inlining erzwingen könnte, vorausgesetzt, dass die grundlegenden Anforderungen für das Inlining erfüllt sind (nicht virtuell)? – Kryptos

+0

@Kryptos: Wenn es für ausdrucksbasierte Mitglieder gelten würde, würde ich erwarten, dass es für normale Mitglieder gültig ist. Ich bezweifle, dass wir irgendwelche Garantien über IL sehen werden, da die Spezifikation sehr selten über IL spricht ... Aber die Spezifikation kann gut sagen, dass die beiden gleichwertig sind. –

6

Sie werden auf die gleiche IL kompilieren, Sie können dies immer selbst testen, indem Sie es tun und ildasm verwenden, um die IL zu extrahieren.

0

Diese Syntax ermöglicht das Schreiben von Elementen einfacher im Lambda-Ausdruck Stil. Das ist der einzige Unterschied.