强制参数评估匿名函数

时间:2011-08-24 12:07:49

标签: c#

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

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

        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)

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

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

基本上,您必须“执行”“EvaluteParameters”中的委托以使其正常工作。或者也许摆弄表达式可以某种方式。

顺便说一下,如果委托在循环中创建,但在之外(之后)调用,这只是一个问题。

哦,ReSharper确实有警告(即使它有时“错误”或过于迂腐)。

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