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.
Sono delegati anonimi. I delegati sono presenti da 1,0 e "anonymous" significa semplicemente "il nome è assegnato dal compilatore" – dman2306
@ dman2306 No, i lambda non vengono compilati in metodi anonimi. Entrambe le funzionalità sono compilate nel codice tradizionale. – Servy
@ dman2306 VB.NET non include i delegati anonimi. –