首頁 > 後端開發 > C++ > 為什麼 Lambda 表達式會捕捉 C# 中迭代​​器變數的最終值?

為什麼 Lambda 表達式會捕捉 C# 中迭代​​器變數的最終值?

Barbara Streisand
發布: 2024-10-29 11:02:02
原創
767 人瀏覽過

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

在C# 中將Lambda 表達式與迭代器結合使用

在C# 中,lambda 表達式提供了一種簡潔便捷的方式來定義匿名函數。然而,將 lambda 表達式與迭代器結合使用時的常見陷阱是捕獲的變數不是迭代器變數的當前值,而是最終值。

請考慮以下程式碼:

<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) };
List<PrintHelloType> helloMethods = new List<PrintHelloType>();

foreach (var type in types)
{
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
    helloMethods.Add(sayHello);
}

foreach (var helloMethod in helloMethods)
{
    Console.WriteLine(helloMethod("Hi"));
}</code>
登入後複製

當您執行此程式碼時,您可能會期望它會列印以下輸出:

Hi String
Hi Single
Hi Int32
登入後複製

但是,實際輸出是:

Hi Int32
Hi Int32
Hi Int32
登入後複製

這是因為lambda 表達式捕捉循環變數類型,而不是定義lambda 時的值。因此,當執行 lambda 時,它使用類型的最終值,即 Int32。

要解決此問題並獲得所需的輸出,可以使用局部變量來捕獲迭代器的當前值變量,如以下代碼所示:

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>
登入後複製

在這種情況下,lambda 表達式會擷取局部變數newType,該變數被賦予type 的當前值。這可確保 lambda 表達式在執行時使用正確的類型值。

以上是為什麼 Lambda 表達式會捕捉 C# 中迭代​​器變數的最終值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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