变量捕获是 C# 闭包中的一个关键方面,它允许封闭函数访问和操作其周围作用域中的变量。本文档深入探讨了变量捕获的工作原理,包括其对值类型和引用类型的影响,以及没有装箱操作。
与普遍认知相反,变量捕获不仅仅是“编译器魔法”的结果。C# 使用一种策略机制,为闭包创建一个临时的辅助类。从周围作用域捕获的每个变量都在此辅助类中分配一个字段。然后,闭包持有对这个辅助类的引用,从而在其生命周期内访问捕获的变量。
值类型和引用类型以相同的方式被捕获。捕获的值是实际的变量本身,而不管其类型如何。例如,提供的代码中的整数计数器作为辅助类中的 int 字段被捕获。
与其他编程语言不同,C# 在捕获值类型时不执行装箱操作。相反,捕获的值直接存储在辅助类的字段中。这种没有装箱操作消除了与托管内存相关的开销,确保了高效的闭包操作。
为了说明变量捕获的过程,考虑一个使用 lambda 表达式捕获单个变量的场景:
<code class="language-c#">using System; class Test { static void Main() { Action action = CreateShowAndIncrementAction(); action(); action(); } static Action CreateShowAndIncrementAction() { Random rng = new Random(); int counter = rng.Next(10); Console.WriteLine("Initial value for counter: {0}", counter); return () => { Console.WriteLine(counter); counter++; }; } }</code>
在这个例子中,lambda 表达式从周围的方法捕获 counter 变量。当调用 lambda 时,它通过辅助类实例访问 counter 的捕获值。这允许 lambda 修改 counter 变量,演示了闭包捕获和操作其封闭作用域中变量的能力。
以上是C# 如何处理闭包中的变量捕获?的详细内容。更多信息请关注PHP中文网其他相关文章!