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