假设我有以下代码:
for(int i=0;i<10;i++)
{
//"i" is captured in the closure passed to LazyCreate
MyApi.AddLazyCreate(() => new foo(/*other params*/ i));
}
这将导致意外行为,因为对于所有添加的闭包,“i”将为 10。
是否有安全的方法来避免这种情况?
例如如果我使用 Expression<func<foo>>
设计我的 api
如果每个“AddLazyCreate”检查传递的表达式并存储这些值的副本,那么应该可以实现预期的行为,对吧?
也就是说,我必须编译表达式中的每个参数并获取参数的时间值,然后使用评估的参数重新创建新表达式。
(表达式将始终是"new"表达式)
或者我在这里遗漏了一些基本的东西? 是否存在我仍然会遇到奇怪行为的三种边缘情况?
最佳答案
你可以这样做:
for(int i=0; i<10; i++)
{
int number = i;
MyApi.AddLazyCreate(() => new foo(/*other params*/ number));
}
这将导致它在循环的每次迭代中捕获不同的数字。
关于c# - 避免闭包中的转义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21160913/