Un lambda peut être mis en œuvre à l'aide d'une fermeture, mais il n'est pas nécessairement en soi une fermeture.
Une fermeture est "une fonction avec un référencement de l'environnement pour les non-variables locales de la fonction.".
Lorsque vous effectuez une expression lambda qui utilise les variables définies à l'extérieur de la méthode, le lambda doit être mis en œuvre à l'aide d'une fermeture. Par exemple:
int i = 42;
Action lambda = () => { Console.WriteLine(i); };
Dans ce cas, le compilateur a généré méthode doit avoir accès à la variable (i
) définies dans un tout autre portée. Pour ce travail, la méthode qu'il génère est une "fonction, ainsi que le référencement de l'environnement" - en gros, c'est la création d'une "fermeture" pour récupérer l'accès à la variable.
Cependant, cette lambda:
Action lambda2 = () => { Console.WriteLine("Foo"); }
Ne repose pas sur un "référencement environnement", puisque c'est un méthode. Dans ce cas, le compilateur génère une normale de la méthode statique, et il n'y a pas de fermeture impliqués à tous.
Dans les deux cas, le lambda est la création d'un delegate
(fonction"objet"), mais c'est seulement à la création d'une fermeture dans le premier cas, que le lambda n'a pas nécessairement besoin de "capturer" le référencement de l'environnement dans tous les cas.