首页 >后端开发 >C++ >如何防止 Lambda 表达式捕获 C# 中的引用?

如何防止 Lambda 表达式捕获 C# 中的引用?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-19 00:01:09216浏览

How Can I Prevent Lambda Expressions from Capturing References in C#?

防止 C# Lambda 表达式中的引用捕获

C# lambda 表达式默认情况下通过引用捕获变量。 这意味着 lambda 表达式维护一个指向原始变量的指针,并且 lambda 创建后对该变量的任何更改都将在 lambda 执行时反映出来。

这是说明此行为的示例:

<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>

执行此代码将打印“10”十次。 发生这种情况是因为每个 lambda 捕获对 single i 变量的引用,循环结束时其值为 10。

为了避免这种引用捕获并确保每个 lambda 获得自己的循环变量值副本,请在循环内创建一个本地副本:

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i; // Create a local copy
    actions.Add(() => Console.WriteLine(copy));
}</code>

现在,每个 lambda 捕获一个不同的 copy 变量,保留其创建时的值。输出将正确显示数字 0 到 9。

重要的是要理解,与其他一些语言(如 C )不同,C# 不提供直接机制来在 lambda 表达式语法本身中显式指定引用或值捕获。 创建本地副本是实现值捕获语义的标准解决方法。

以上是如何防止 Lambda 表达式捕获 C# 中的引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

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