變數捕獲是 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中文網其他相關文章!