避免在关闭

问题描述:

逃脱值假设我有以下代码:避免在关闭

for(int i=0;i<10;i++) 
{ 
    //"i" is captured in the closure passed to LazyCreate 
    MyApi.AddLazyCreate(() => new foo(/*other params*/ i)); 
} 

这将导致无意的行为,因为“我”将是10对所有添加的*。

有没有安全的方法来避免这种情况? 例如如果我设计我的API使用Expression<func<foo>> 如果每个“AddLazyCreate”检查传递的表达式并存储这些值的副本,那么应该有可能实现预期的行为,对吗? 也就是说,我必须从表达式中编译每个参数并获取参数的时间值,并使用评估的参数重新创建新的表达式。 (表达式将永远是一个“新”表达式)

或者我在这里丢失了什么? 是否我还会得到奇怪的行为?

+0

根据Eric的说法,这将在C#5中“固定”http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two .aspx – Maarten

+1

@Maarten只在foreach循环中。 For循环仍然捕获最后的结果。 – TylerD87

+0

@ TylerD87我站在更正:-) – Maarten

你可以只是这样做:

for(int i=0; i<10; i++) 
{ 
    int number = i; 
    MyApi.AddLazyCreate(() => new foo(/*other params*/ number)); 
} 

这将导致它捕获到循环的每个迭代不同数量。

+0

omg我怎么可能错过了!?,是行为从.NET的早期版本??,我敢肯定唯一的方法是创建闭包它是自己的函数,关闭函数参数 –

+0

@RogerAlsing不,自从lambdas被引入后,这个工作。 – svick