」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 捕獲閉包在C# 5.0中為何在for循環中 problematic,而在foreach循環中則無此問題?

捕獲閉包在C# 5.0中為何在for循環中 problematic,而在foreach循環中則無此問題?

發佈於2025-04-12
瀏覽:311

Why are Captured Closures Problematic in C# 5.0 For Loops but Not Foreach Loops?

C# 5.0 循環中的捕獲閉包:For循環與Foreach循環的差異

問題:

在 C# 5.0 中,foreach 循環中的捕獲閉包能夠正確捕獲,但為什麼 for 循環中的捕獲閉包仍然存在問題?

解答:

從邏輯上看,for 循環中閉包的行為是合理的。將 for 循環分解為其組成部分(初始化器、條件、迭代器和主體)後,初始化器只執行一次。因此,只存在一個“變量實例化”是合乎邏輯的。

此外,在 for 循環中,每次迭代的變量初始值並非預先確定的。考慮以下示例:

for (int i = 0, j = 10; i  Console.WriteLine(i, j);
    action();
}

在這個循環中,j 的值在循環期間可能會發生變化。在這種情況下,預期的行為是什麼?

相反,foreach 循環似乎為每次迭代聲明一個新變量,並且該變量是只讀的。因此,將 foreach 循環視為在每次迭代中聲明一個單獨的只讀變量,其值取自迭代器是合理的。這解釋了為什麼在 foreach 循環中閉包能夠正確捕獲。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3