匿名函数的力参数评估

本文关键字:参数 评估 函数 | 更新日期: 2023-09-27 18:06:43

我想知道是否有简单的方法来强制匿名函数的参数评估?

用于多线程编程。例如当我写

        for(int i=0; i<5; ++i)
        {
            Task.Factory.StartNew(() => Console.WriteLine(i));
        }

大多数人会得到五次"5"。实际上,代码片段更有可能输出0到5。

一个快速的解决方案如下:

        for(int i=0; i<5; ++i)
        {
            var local = i;
            Task.Factory.StartNew(() => Console.WriteLine(local));
        }

我认为如果存在以下方法来评估匿名函数的所有参数并返回一个与原始逻辑相同的逻辑,生活会更好:

    Action EvaluateParameters(Action action)

任何想法?

谢谢。

匿名函数的力参数评估

我不知道如果没有编译器或框架支持,这样的方法是否甚至(合理地)可能。最后,编译器确实生成代码来提升变量,而不是在创建委托时提升它的值,这会导致这种行为。

基本上,你必须在"EvaluteParameters"内部"执行"委托才能使其工作。或者也许摆弄一下表达式就能做到这一点。

顺便说一句,只有当委托在循环内创建,但在(之后)外部调用时,才会出现问题。

哦,ReSharper确实有一个警告(即使它有时是"错误的"或过于迂腐)。

无论如何,Jon Skeet在他的书(c# in Depth)中提到,在社区中确实有一些困惑,微软正在考虑在未来的版本中改变这种行为(希望我从记忆中得到的是正确的)。如果不破坏依赖于当前行为的现有代码(或者因为它而意外地工作),这甚至可能是不可能的。