我试图在这里找到答案,但是还没有。
在提供的示例代码中:
- 在循环中,我将动作添加到列表中。每个动作都是一个lambda表达式,它调用一个方法并传递与动作相关的参数和循环变量。
- 以后我执行所有动作时,所有动作在内部使用相同的值-循环相关变量是离开循环后的值!
我的问题:
- 怎么了?
- 如何编码断言才能成功?
这是上面提到的代码:
using System;
using System.Collections.Generic;
using System.Text;
using microsoft.VisualStudio.TestTools.UnitTesting;
namespace actionList
{
[TestClass]
public class actionListWeardnessTest
{
[TestMethod]
public void TestMethod1()
{
var actionLIst = new List<action<StringBuilder>>();
for (int idx = 0; idx < 3; idx++)
{
actionLIst.Add((sb) => AddNumberToStringBuilder(idx,sb));
}
var actual = new StringBuilder();
foreach (var action in actionLIst)
{
action(actual);
}
Assert.AreEqual("012",actual.ToString()); // but it is "333" !!!!!!!!!!!!!!
}
private void AddNumberToStringBuilder(int idx,StringBuilder sb)
{
sb.Append(idx);
}
}
}
PS:我想在后台任务中创建动作列表,并在UI线程上正确同步执行它以绘制一些东西。
这可能类似于命令模式。