Предположат, у меня есть следующий код:Избежание сбежавших значений в затворах
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» проверяет переданное выражение и сохраняет копии этих значений, тогда должно быть возможно достичь намеченного поведения, не так ли? , то есть я должен скомпилировать каждый аргумент из выражения и получить временное значение аргумента и воссоздать новое выражение, используя оцененные аргументы. (выражение всегда будет «новым» выражением)
Или я пропустил что-то фундаментальное здесь? Являются ли те рекказы, где я по-прежнему получаю странное поведение?
Согласно Эрику, это будет «исправлено» на C# 5 http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two .aspx – Maarten
@Maarten Только в петлях foreach. Для циклов все еще фиксируется последний результат. – TylerD87
@ TylerD87 Я стою исправлено :-) – Maarten