首頁 > 後端開發 > C++ > C# 如何處理閉包中的變數擷取?

C# 如何處理閉包中的變數擷取?

Barbara Streisand
發布: 2025-01-12 21:07:43
原創
743 人瀏覽過

How Does C# Handle Variable Capture in Closures?

深入理解 C# 閉包中的變數擷取

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板