La capture de variables est un aspect clé des fermetures C#, qui permet à la fonction englobante d'accéder et de manipuler les variables dans sa portée environnante. Ce document fournit un aperçu approfondi du fonctionnement de la capture de variables, y compris son impact sur les types valeur et les types référence, ainsi que l'absence d'opérations de boxe.
Contrairement à la croyance populaire, la capture de variables n'est pas seulement le résultat de la « magie du compilateur ». C# utilise un mécanisme de stratégie pour créer une classe d'assistance temporaire pour les fermetures. Chaque variable capturée dans la portée environnante se voit attribuer un champ dans cette classe d'assistance. La fermeture contient alors une référence à cette classe auxiliaire, accédant ainsi aux variables capturées pendant sa durée de vie.
Les types valeur et les types référence sont capturés de la même manière. La valeur capturée est la variable elle-même, quel que soit son type. Par exemple, le compteur entier dans le code fourni est capturé en tant que champ int dans la classe d'assistance.
Contrairement à d'autres langages de programmation, C# n'effectue pas de boxing lors de la capture de types de valeurs. Au lieu de cela, la valeur capturée est stockée directement dans le champ de la classe auxiliaire. Cette absence de boxing élimine la surcharge associée à la mémoire gérée et garantit des opérations de fermeture efficaces.
Pour illustrer le processus de capture de variable, considérons un scénario dans lequel une expression lambda est utilisée pour capturer une seule variable :
<code class="language-c#">using System; class Test { static void Main() { Action action = CreateShowAndIncrementAction(); action(); action(); } static Action CreateShowAndIncrementAction() { Random rng = new Random(); int counter = rng.Next(10); Console.WriteLine("Initial value for counter: {0}", counter); return () => { Console.WriteLine(counter); counter++; }; } }</code>
Dans cet exemple, l'expression lambda capture la variable counter de la méthode environnante. Lorsque le lambda est appelé, il accède à la valeur capturée du compteur via l'instance de classe d'assistance. Cela permet au lambda de modifier la variable du compteur, démontrant la capacité de la fermeture à capturer et à manipuler les variables dans sa portée englobante.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!