防止 C# Lambda 表達式中的引用捕獲
C# lambda 表達式預設會透過引用捕獲變數。 這意味著 lambda 表達式維護一個指向原始變數的指針,並且 lambda 創建後對該變數的任何更改都將在 lambda 執行時反映出來。
這是說明此行為的範例:
<code class="language-csharp">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 捕獲對 single i
變數的引用,循環結束時值為 10。
為了避免這種引用捕獲並確保每個 lambda 獲得自己的循環變數值副本,請在循環內建立一個本地副本:
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // Create a local copy actions.Add(() => Console.WriteLine(copy)); }</code>
現在,每個 lambda 捕獲一個不同的 copy
變量,保留其創建時的值。輸出將正確顯示數字 0 到 9。
重要的是要理解,與其他一些語言(如 C )不同,C# 不提供直接機制來在 lambda 表達式語法本身中明確指定引用或值捕獲。 建立本地副本是實現值捕獲語義的標準解決方法。
以上是如何防止 Lambda 表達式捕捉 C# 中的參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!