Maison >développement back-end >C++ >Capturer des copies ou des références en C# Lambdas : quand choisir lequel ?

Capturer des copies ou des références en C# Lambdas : quand choisir lequel ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-19 00:16:09625parcourir

Capturing Copies or References in C# Lambdas: When Should You Choose Which?

La différence entre les copies capturées et les références dans les expressions C# Lambda

Lors de la définition d'expressions lambda en C#, il est crucial de comprendre comment elles interagissent avec des variables externes. Par défaut, les expressions lambda ont tendance à capturer les références à des variables externes. Cependant, dans certains cas, il est crucial de les forcer à copier ces variables.

Considérons l'exemple suivant, conçu pour imprimer une série de nombres à l'aide d'une expression Lambda et d'une boucle :

<code class="language-csharp">class Program
{
    delegate void Action();
    static void Main(string[] args)
    {
        List<Action> actions = new List<Action>();

        for (int i = 0; i < 10; i++)
            actions.Add(() => Console.WriteLine(i));

        foreach (Action a in actions)
            a();
    }
}</code>

Cependant, l'extrait de code ci-dessus affiche "10" à plusieurs reprises, indiquant que l'expression Lambda capture une référence à la variable partagée i. Même si la valeur de i change au cours de la boucle, l'expression lambda imprime toujours la valeur finale de i, qui est 10.

Pour forcer l'expression lambda à capturer une copie de la variable plutôt qu'une référence, une solution de contournement consiste à créer une copie locale de la variable à l'intérieur de la boucle :

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i;  // 创建局部副本
    actions.Add(() => Console.WriteLine(copy));
}</code>

En copiant la valeur de i dans une nouvelle copie de variable, l'expression Lambda capture efficacement la valeur de i à un moment et dans une portée spécifiques. Cela garantit que l'expression lambda imprime le numéro correct à chaque itération de la boucle.

Comprendre ce comportement est crucial pour utiliser les expressions lambda en C#. Il permet aux développeurs de contrôler la manière dont les expressions lambda interagissent avec les variables partagées et garantit que les programmes s'exécutent comme prévu.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn