2015-05-06 10 views
7

Ad esempio, è possibile utilizzare espressioni lambda in Visual Studio 2010, ma continuare a utilizzare .NET 2.0.Come vengono risolti i lambda nel framework .NET?

In che modo il compilatore risolve le espressioni lambda con un framework meno recente che non include questa funzionalità?

+0

Sono delegati anonimi. I delegati sono presenti da 1,0 e "anonymous" significa semplicemente "il nome è assegnato dal compilatore" – dman2306

+1

@ dman2306 No, i lambda non vengono compilati in metodi anonimi. Entrambe le funzionalità sono compilate nel codice tradizionale. – Servy

+0

@ dman2306 VB.NET non include i delegati anonimi. –

risposta

8

Lambdas non fa affidamento su nessuna delle nuove funzionalità del framework. Un lambda, alla fine della giornata, deve solo essere in grado di creare una nuova classe con campi, metodi e costruttori, tutti disponibili nel runtime/framework 1.0.

Il seguente codice:

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

si trasformerà in un nuovo tipo di nome:

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

e saranno utilizzati in questo modo:

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

Ora, ci sono un poche situazioni che non richiedono tutto questo; se non ci sono valori chiusi, alcuni di questi passaggi possono essere esaltati e le ottimizzazioni aggiunte (cioè il metodo può essere reso statico, per evitare la creazione di un'istanza dell'oggetto), ma la trasformazione mostrata qui è in grado di mappare qualsiasi lambda C# valido e come puoi vedere, il codice che ha trasformato in sarebbe valido anche in C# 1.0.

5

Le espressioni lambda sono caratteristiche del compilatore. Non hai bisogno di un framework o di un supporto CLR per questo.

Il compilatore creerà un metodo per te ed eseguirà la conversione implicita dei delegati e tutte quelle cose per te. Tutto ciò di cui hai bisogno è il nuovo compilatore in cui è stata implementata la funzionalità.

La maggior parte delle funzionalità della lingua non è associata a nessuna versione di .Net framework. Alcuni di loro funzionano solo; alcuni di essi possono essere modificati usando alcuni trucchi.

Ad esempio: Conversione delegata implicita, Inizializzazione raccolta, Inizializzazione oggetto funzionerà come è. I metodi di estensione possono essere utilizzati con alcuni trucchi.

Consultare Jon's article, "Utilizzo di C# 3 in .NET 2.0 e 3.0" per ulteriori informazioni.

FWIW, utilizzando lo stesso concetto solo la libreria BCL.Async abilita la funzione async-await in .Net 4.0 che è stata rilasciata insieme a .net 4.5.

Problemi correlati