首頁 > 後端開發 > C++ > C# Lambda 擷取中的引用與複製:何時會出現意外行為?

C# Lambda 擷取中的引用與複製:何時會出現意外行為?

Patricia Arquette
發布: 2025-01-18 23:56:10
原創
334 人瀏覽過

Reference vs. Copy in C# Lambda Capture: When Do I Get Unexpected Behavior?

深入理解C#中的Lambda捕獲:引用與複製

在C#中,Lambda表達式可以捕捉封閉作用域中的變數。當Lambda捕獲變數的引用時,對該變數的任何更改都將反映在Lambda中。這可能會導致意想不到的行為,如下面的程式碼片段所示:

<code class="language-C#">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函數捕捉了變數i的引用,當在for迴圈中i遞增時,Lambda函數仍然看到更新後的值。

為了捕捉變數的副本而不是引用,可以使用以下語法:

<code class="language-C#">[=] () => { ... } // 捕获副本</code>
登入後複製

在此範例中,Lambda函數將擷取變數i的副本,封閉作用域中對i的任何變更都不會反映在Lambda函數中。

以下是一個修改後的範例,示範如何擷取副本:

<code class="language-C#">for (int i = 0; i < 10; i++)
{
    int copy = i; // 创建一个局部副本
    actions.Add(() => Console.WriteLine(copy));
}</code>
登入後複製

在這種情況下,Lambda函數將列印copy的值,該值是在建立Lambda函數時i的值的副本。

透過理解捕獲引用和捕獲副本之間的區別,您可以避免Lambda函數中的意外行為。

以上是C# Lambda 擷取中的引用與複製:何時會出現意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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