Lambda以某种方式通过引用而不是通过值使用参数?

我试图在这里找到答案,但是还没有。

在提供的示例代码中:

  • 在循环中,我将动作添加到列表中。每个动作都是一个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线程上正确同步执行它以绘制一些东西。

这可能类似于命令模式。

zylan131415 回答:Lambda以某种方式通过引用而不是通过值使用参数?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3088490.html

大家都在问