首页 >后端开发 >C++ >C# Lambda 捕获中的引用与复制:何时会出现意外行为?

C# Lambda 捕获中的引用与复制:何时会出现意外行为?

Patricia Arquette
Patricia Arquette原创
2025-01-18 23:56:10286浏览

Reference vs. Copy in C# Lambda Capture: When Do I Get Unexpected Behavior?

深入理解C#中的Lambda捕获:引用与复制

在C#中,Lambda表达式可以捕获封闭作用域中的变量。当Lambda捕获变量的引用时,对该变量的任何更改都将反映在Lambda中。这可能会导致意想不到的行为,如下面的代码片段所示:

<code class="language-C#">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>

运行此代码时,它会打印十次数字10。这是因为Lambda函数捕获了变量i的引用,当在for循环中i递增时,Lambda函数仍然看到更新后的值。

为了捕获变量的副本而不是引用,可以使用以下语法:

<code class="language-C#">[=] () => { ... } // 捕获副本</code>

在此示例中,Lambda函数将捕获变量i的副本,封闭作用域中对i的任何更改都不会反映在Lambda函数中。

以下是一个修改后的示例,演示了如何捕获副本:

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

在这种情况下,Lambda函数将打印copy的值,该值是在创建Lambda函数时i的值的副本。

通过理解捕获引用和捕获副本之间的区别,您可以避免Lambda函数中的意外行为。

以上是C# Lambda 捕获中的引用与复制:何时会出现意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn