Explication détaillée de la capture de variables dans les fermetures C#
Présentation
La capture de variables est un aspect fondamental des fermetures C# qui permet à une fermeture d'accéder aux variables définies dans sa portée englobante. Cet article approfondit la capture de variables, répondant à des questions spécifiques sur son fonctionnement, la capture de type valeur par rapport à la capture de type référence et la boxe.
Comment les variables locales sont capturées
La capture de variable se produit lorsqu'une expression lambda ou une méthode anonyme accède à une variable locale dans sa portée englobante. Cependant, le mécanisme exact de capture n’est pas évident.
Pour comprendre cela, prenons un exemple simple :
<code class="language-csharp">Action action = () => { Console.WriteLine(counter); }; int counter = 5;</code>
Dans cet exemple, l'expression lambda capture la variable counter
dans sa portée englobante. Pour ce faire, le compilateur crée en fait une classe anonyme, appelée classe de fermeture, qui stocke une référence à la variable capturée. Lorsque l'expression lambda est exécutée, elle accède à la variable capturée via la classe de fermeture :
<code class="language-csharp">class ClosureClass { private int counter; public ClosureClass(int counter) { this.counter = counter; } public void Execute() { Console.WriteLine(counter); } }</code>
Dans ce cas, la classe de fermeture stocke une référence à la variable counter
et fournit une méthode pour y accéder.
Types de valeur et types de référence
Le type de la variable capturée détermine comment elle est stockée dans la classe de fermeture :
Emballage
Aucune boxe n’est impliquée lors de la capture des types de valeur. La valeur capturée est stockée directement dans la classe de fermeture et la variable d'origine peut être modifiée sans affecter la valeur capturée.
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!