访问修改后的闭包(2)

这是从Access到Modified Closure的扩展。我只想验证以下内容是否真的足够安全用于生产。


List<string> lists = new List<string>();

//Code to retrieve lists from DB    

foreach (string list in lists)

{

    Button btn = new Button();

    btn.Click += new EventHandler(delegate { MessageBox.Show(list); });

}

每次启动我只会执行一次以上操作。目前看来,它工作正常。正如乔恩(Jon)在某些情况下提到的违反直觉的结果。那么,我需要在这里注意什么?如果列表多次运行,可以吗?


慕森王
浏览 448回答 3
3回答

aluckdog

这很棘手,但是上面的解释对我来说很清楚:&nbsp;这似乎是正确的,但实际上,每当单击任何按钮时,只会使用str变量的最后一个值。这样做的原因是foreach进入了while循环,但是迭代变量是在该循环之外定义的。这意味着,当您显示消息框时,str的值可能已经被迭代为字符串集合中的最后一个值。
打开App,查看更多内容
随时随地看视频慕课网APP