2015-05-06 14 views
7

Beispielsweise können Sie in Visual Studio 2010 Lambda-Ausdrücke verwenden, aber immer noch auf .NET 2.0 abzielen.Wie werden Lambdas im .NET Framework aufgelöst?

Wie löst der Compiler Lambda-Ausdrücke auf, um mit einem älteren Framework zu arbeiten, das diese Funktion nicht enthält?

+0

Sie sind anonyme Delegierte. Delegierte sind seit 1.0 da und "anonym" bedeutet einfach "der Name wird vom Compiler zugewiesen" – dman2306

+1

@ dman2306 Nein, Lambdas werden nicht in anonyme Methoden kompiliert. Beide Funktionen sind in herkömmlichen Code zusammengefasst. – Servy

+0

@ dman2306 VB.NET enthält keine anonymen Delegaten. –

Antwort

8

Lambdas verlassen sich nicht auf irgendwelche der neueren Rahmeneigenschaften. Ein Lambda, am Ende des Tages, muss nur in der Lage sein, eine neue Klasse mit Feldern, Methoden und Konstruktoren zu erstellen, die alle im 1.0-Runtime/Framework verfügbar sind.

Der folgende Code:

public class SomeRandomCompilerGeneratedNameGoesHere 
{ 
    public int value; 
    public int SomeGeneratedMethodName() 
    { 
     //the content of the anonymous method goes here 
     return value; 
    } 
} 

Und wird verwendet werden, etwa so::

int value = 42; 
MyDelegate f =() => value; 

Wird in einen neuen Namen Typ umgewandelt werden

var closureClass = new SomeRandomCompilerGeneratedNameGoesHere(); 
closureClass.value = 42; 
MyDelegate f = closureClass.SomeGeneratedMethodName; 

Nun gibt es ein einige Situationen, die nicht alles erfordern; Wenn keine geschlossenen Werte vorhanden sind, können einige dieser Schritte angeregt und Optimierungen hinzugefügt werden (dh die Methode kann statisch gemacht werden, um die Erzeugung einer Objektinstanz zu vermeiden), aber die hier gezeigte Transformation kann jedes gültige C# Lambda abbilden und wie Sie sehen können, wäre der Code, in den er umgewandelt wurde, auch in C# 1.0 gültig.

5

Lambda-Ausdrücke sind Compiler-Features. Sie benötigen dafür keinen Framework- oder CLR-Support.

Compiler wird eine Methode für Sie erstellen und führen Sie die implizite Delegat-Konvertierung und all diese Sachen für Sie. Sie benötigen lediglich den neuen Compiler, in dem das Feature implementiert wurde.

Die meisten Sprachfeatures sind nicht an eine Version von .Net Framework gebunden. Einige von ihnen arbeiten nur; einige von ihnen können mit ein paar Tricks optimiert werden.

Zum Beispiel: Implizite Delegatkonvertierung, Sammlungsinitialisierer, Objektinitialisierer funktioniert wie es ist. Erweiterungsmethoden können mit einigen Tricks verwendet werden. Weitere Informationen finden Sie in Jon's article, Abschnitt "Verwenden von C# 3 in .net 2.0 und 3.0".

FWIW, Mit dem gleichen Konzept nur BCL.Async Bibliothek ermöglicht Asynchron-warten-Funktion in .NET 4.0, die zusammen mit .net 4.5 veröffentlicht wurden.

Verwandte Themen