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