最近我讀了C#的深度和它,我一直在使用他們考績數據點擊事件,與此類似的教我什麼是lambda表達式:如何避免在lambda表達式中捕獲變量?
image.MouseDown+=(o ,e)=>MethodToDoSomething(DataNeededForAction);
現在的問題是變量當在foreach循環中使用時捕獲(感謝Jon Skeet使這部分真的很清楚:),當初始化有我訂閱的事件的幾個對象時,我通常會遇到變量捕獲問題。請看下面的例子:
foreach (var game in GamesCollection)
{
Image img = new Image();
img.Width = 100;
img.MouseDown+=(o,e) => MyMethod(game.id);
}
爲了避免在這種情況下,我必須添加一些變量指定的遊戲,然後將該變量傳遞給方法捕獲,這將創建額外的代碼不清且多,更加雜亂。 有沒有辦法繞過這個?有些東西至少會看起來更清潔?
Thx,Ziv
由於寫了這個答案,因此C#團隊決定在C#5中循環內移動循環變量(鏈接文章被更新)。現在問題中的代碼不需要複製'遊戲'變量。 – 2012-11-06 19:39:49
@AndersAbel:的確如此。不幸的是,有太多的答案回到現在修復它們:( – 2012-11-06 19:41:25