2011-08-24 129 views
3

我不知道是否有简单的方法来强制匿名函数的参数评估?对于多线程编程,这是重要的匿名函数的力参数评估

。 例如,当我写

 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) 

任何想法?

谢谢。

+0

他们将如何获得5次,5次? – 2011-08-24 12:10:22

+5

@CodeMonkey:试试吧,它是真的。 Eric Lippert写的那篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – Jens

+0

@Jens:啊有趣。 – 2011-08-24 12:13:45

回答

0

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

基本上,您将不得不“执行”“EvaluteParameters”中的委托来使其工作。或者也许可以用某种方法来处理表达式。

BTW,这只是一个问题,如果委托创建的循环,但调用(后)外面。

呵呵,ReSharper确实有一个警告(即使它有时是“错误的”或过于迂腐)。无论如何,Jon Skeet在他的书(C#深入)中提到,在社区中确实存在一些困惑,并且微软正在考虑在未来的版本中改变行为(希望我能够在某种程度上是正确的从记忆里)。如果不破坏取决于当前行为的现有代码(或者由于它而意外工作),那么这甚至是不可能的。

+0

谢谢。我也认为实现它的唯一方法是通过表达式(匿名函数)并正确评估参数。 – scleung