在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中文网其他相关文章!