Aller au contenu

Capture de variables externes (fermetures)

Contexte : Les lambdas peuvent capturer des variables de la portée englobante. Les variables capturées sont stockées dans une fermeture et vivent aussi longtemps que la lambda.

int factor = 2;
Func<int, int> multiplier = x => x * factor;
Console.WriteLine(multiplier(5)); // 10
factor = 3;
Console.WriteLine(multiplier(5)); // 15 (capture par référence)
List<Action> actions = new List<Action>();
for (int i = 0; i < 3; i++)
{
int captured = i;
actions.Add(() => Console.WriteLine(captured));
}
foreach (var a in actions) a(); // 0,1,2 (pas 3,3,3)

La capture peut entraîner des allocations (objets de fermeture). Évitez la capture dans les boucles critiques pour la performance.

Continuation de tâche : Capturer userId dans une continuation de tâche asynchrone.

int userId = GetUserId();
Task.Run(() => ProcessUser(userId));

Exemple : Dans ASP.NET Core, les lambdas dans les middlewares capturent souvent des valeurs de configuration.