c# - 避免闭包中的转义值

标签 c# closures lazy-evaluation linq-expressions

假设我有以下代码:

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/

相关文章:

c# - 如何在 SqlParameter 中为数据类型位传递正确的对象值?

c# - 希望对 SQL Server 数据库应用程序的 C# TCP 监听器进行代码改进

ios - 函数返回后调用转义闭包是什么意思?

haskell - 惰性数据类型的内存使用情况

c# - 使用 Simple Injector 的方法级属性拦截

php - 调用直接分配给对象属性的闭包

ios - NumberFormatter 只能写在闭包中

r - R 中列表元素的惰性求值

javascript - 如何使用 JS 延迟加载新的 Google Adsense 代码

c# - 如何检查浏览器是否打开