当前位置: 首页 > 编程语言 > C#

LoopActionList分享

时间:2023-04-10 21:27:29 C#

LoopActionList怎么遍历Action列表看不懂。当我尝试它时,我最终得到与上一次迭代相同的值。这是代码(简化示例):string[]strings={"abc","def","ghi"};varactions=newList();foreach(stringstrinstrings)actions.Add(newAction(()=>{Trace.WriteLine(str);}));foreach(varactioninactions)action();输出:ghighighi为什么在执行操作时总是选择字符串中的最后一个元素?我怎样才能获得所需的输出:abcdefghi你的动作是一个闭包,所以它访问str本身,而不是str的副本:foreach(stringstrinstrings){varcopy=str;//这将完成工作actions.Add(newAction(()=>{Trace.WriteLine(copy);}));这是一个相当复杂的情况。简短的回答是在将其分配给闭包之前创建局部变量的副本:stringcopy=str;actions.Add(newAction(()=>{Trace.WriteLine(copy);}));有关更多信息,请查看有关闭包的文章。这种行为是由闭包调节的。lambda中的变量是引用而不是值的副本。这意味着指向str的假定最新值,在您的情况下为“ghi”。这就是为什么每次调用它都会进入相同的内存位置并自然地恢复相同的值。如果您像提供的答案那样编写代码,您会强制C#编译器每次重新生成一个新值,因此新地址将传递给labmda,因此每个lambda都会有自己的变量。顺便说一句,如果我没记错的话,C#团队承诺会在C#5.0中修复这种不自然的行为。所以最好查看他们关于此主题的博客以获取未来更新。以上就是C#学习教程:循环操作列表分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: