首頁 >後端開發 >C++ >如何防止 Lambda 表達式捕捉 C# 中的參考?

如何防止 Lambda 表達式捕捉 C# 中的參考?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-19 00:01:09265瀏覽

How Can I Prevent Lambda Expressions from Capturing References in C#?

防止 C# Lambda 表達式中的引用捕獲

C# lambda 表達式預設會透過引用捕獲變數。 這意味著 lambda 表達式維護一個指向原始變數的指針,並且 lambda 創建後對該變數的任何更改都將在 lambda 執行時反映出來。

這是說明此行為的範例:

<code class="language-csharp">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();
    }
}</code>

執行此程式碼將列印「10」十次。 發生這種情況是因為每個 lambda 捕獲對 single i 變數的引用,循環結束時值為 10。

為了避免這種引用捕獲並確保每個 lambda 獲得自己的循環變數值副本,請在循環內建立一個本地副本:

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i; // Create a local copy
    actions.Add(() => Console.WriteLine(copy));
}</code>

現在,每個 lambda 捕獲一個不同的 copy 變量,保留其創建時的值。輸出將正確顯示數字 0 到 9。

重要的是要理解,與其他一些語言(如 C )不同,C# 不提供直接機制來在 lambda 表達式語法本身中明確指定引用或值捕獲。 建立本地副本是實現值捕獲語義的標準解決方法。

以上是如何防止 Lambda 表達式捕捉 C# 中的參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn