首頁 > 後端開發 > C++ > 在 C# Lambda 中捕獲副本或引用:何時應該選擇哪一個?

在 C# Lambda 中捕獲副本或引用:何時應該選擇哪一個?

Mary-Kate Olsen
發布: 2025-01-19 00:16:09
原創
627 人瀏覽過

Capturing Copies or References in C# Lambdas: When Should You Choose Which?

C# Lambda 表達式中擷取副本與引用的差異

在 C# 中定義 Lambda 表達式時,理解它們如何與外部變數交互作用至關重要。預設情況下,Lambda 表達式傾向於捕獲對外部變數的引用。但是,在某些情況下,強制它們複製這些變數至關重要。

考慮以下範例,該範例旨在使用 Lambda 表達式和循環列印一系列數字:

class Program
{
    delegate void Action();
    static void Main(string[] args)
    {
        List<Action> actions = new List<Action>();

        for (int i = 0; i < 10; i++)
            actions.Add(() => Console.WriteLine(i));

        foreach (Action a in actions)
            a();
    }
}
登入後複製

然而,上面的程式碼片段重複列印“10”,這表明 Lambda 表達式捕獲了對共享變數 i 的引用。即使 i 的值在循環中發生變化,Lambda 表達式始終會列印 i 的最終值,即 10。

為了強制 Lambda 表達式捕獲變數的副本而不是引用,一種解決方法是在循環內建立變數的局部副本:

for (int i = 0; i < 10; i++)
{
    int copy = i;  // 创建局部副本
    actions.Add(() => Console.WriteLine(copy));
}
登入後複製

透過將 i 的值複製到新的變數 copy,Lambda 表達式有效地捕捉了 i 在特定時間和作用域的值。這確保了 Lambda 表達式在循環的每次迭代中列印正確的數字。

理解這種行為對於在 C# 中使用 Lambda 表達式至關重要。它允許開發人員控制 Lambda 表達式如何與共享變數交互,並確保程式按預期運行。

以上是在 C# Lambda 中捕獲副本或引用:何時應該選擇哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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