C# 閉包中變數擷取的詳細解釋
引言
變數擷取是C#閉包中的一個基本面,它允許閉包存取在其封閉作用域中定義的變數。本文將深入探討變數捕獲,解答有關其運作方式、值類型與引用類型捕獲以及裝箱等特定問題。
局部變數是如何被捕獲的
當lambda表達式或匿名方法存取其封閉作用域中的局部變數時,就會發生變數捕獲。然而,捕獲的確切機制並不顯而易見。
為了理解這一點,讓我們考慮一個簡單的例子:
<code class="language-csharp">Action action = () => { Console.WriteLine(counter); }; int counter = 5;</code>
在這個例子中,lambda表達式捕捉了其封閉作用域中的變數counter
。為了實現這一點,編譯器實際上會創建一個匿名類,稱為閉包類,它儲存對被捕獲變數的引用。當lambda表達式被執行時,它透過閉包類別存取被捕獲的變數:
<code class="language-csharp">class ClosureClass { private int counter; public ClosureClass(int counter) { this.counter = counter; } public void Execute() { Console.WriteLine(counter); } }</code>
在這種情況下,閉包類別儲存對變數counter
的引用,並提供一個方法來存取它。
值型別與引用型別
被捕獲變數的類型決定了它如何在閉包類別中儲存:
裝箱
捕獲值類型時不涉及裝箱。被捕獲的值直接儲存在閉包類別中,並且可以修改原始變數而不影響被捕獲的值。
以上是變數捕獲在 C# 閉包中如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!