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