Un lambda può essere implementato utilizzando una chiusura, ma non è necessariamente una chiusura.
A closure è "una funzione insieme a un ambiente di riferimento per le variabili non locali di tale funzione.".
Quando si esegue un'espressione lambda che utilizza variabili definite al di fuori del metodo, il lambda deve essere implementato utilizzando una chiusura. Ad esempio:
int i = 42;
Action lambda =() => { Console.WriteLine(i); };
In questo caso, il metodo compilatore generato deve avere accesso alla variabile (i
) definita in un ambito completamente diverso. Perché funzioni, il metodo che genera è una "funzione insieme all'ambiente di riferimento" - in pratica, sta creando una "chiusura" per recuperare l'accesso alla variabile.
Tuttavia, questo lambda:
Action lambda2 =() => { Console.WriteLine("Foo"); }
non si basa su alcun "ambiente riferimento", in quanto si tratta di un metodo completamente contenuto. In questo caso, il compilatore genera un normale metodo statico e non vi è alcuna chiusura implicata.
In entrambi i casi, lambda sta creando un delegate
("oggetto funzione"), ma è solo creando una chiusura nel primo caso, poiché il lambda non ha necessariamente bisogno di "catturare" l'ambiente di riferimento in tutti i casi .
fonte
2012-03-06 20:47:05
NB sono chiamate chiusure. "Clojure" è una lingua (da qui la mia modifica). –
Ah - questo chiarisce definitivamente questa confusione! Grazie –
Le chiusure sono un aspetto delle espressioni lambda. Lambdas non deve necessariamente supportare chiusure. Alcune lingue lo implementano in modo diverso. Ad esempio, Java è diverso da C# in quanto non consente la modifica della variabile chiusa sopra all'interno della funzione. Detto questo, penso che questa domanda riguardi la comprensione generale, quindi il duplicato di [Qual è la differenza tra una "chiusura" e una "lambda"?] (Http://stackoverflow.com/questions/220658/what-is-the- differenza tra una chiusura e una lambda) – nawfal