首頁 > 後端開發 > C++ > 變數捕獲在 C# 閉包中如何運作?

變數捕獲在 C# 閉包中如何運作?

Susan Sarandon
發布: 2025-01-12 21:16:44
原創
996 人瀏覽過

How Does Variable Capture Work in C# Closures?

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中文網其他相關文章!

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