3

我翻译了这段代码(它只捕获外部变量有不好的副作用):

foreach (TaskPluginInfo tpi in Values)
{                    
    GenerateMenu(menuStrip, tpi.MenuTree, tpi.MenuText, delegate { tpi.ShowTask() });
}

至此代码(因为上述代码不起作用):

foreach (TaskPluginInfo tpi in Values)
{                    
    // must capture the variable
    var x = tpi;
    GenerateMenu(menuStrip, tpi.MenuTree, tpi.MenuText, delegate { x.ShowTask(); });
}

解决这种鲜为人知的副作用的正确术语是什么?现在,我评论说“必须捕获变量”。捕获这个词是正确的术语吗?

4

6 回答 6

2

好吧, tpi 和 x 都是在其中一个示例中捕获的变量(不同种类的)......这里的重点是您希望将捕获的变量的范围(理想情况下x)限制在循环内部。

所以,也许;“捕获迭代变量的;而不是迭代变量本身”

于 2009-07-06T09:49:58.443 回答
1

您实际上正在做的是创建一个包含每次迭代的迭代器值的闭包上下文。只要委托存在,该上下文就对委托保持可用。

您如何称呼您所指的陈述?我认为“捕获”是一个很好的动词。最后,只要每个人都清楚你的意思,就可以了:-)

于 2009-07-06T09:54:33.817 回答
1

Resharper 的警告称这种情况为“访问修改后的闭包”,推荐的解决方案是“捕获变量”,所以在我的评论中我会说“必须捕获变量以避免访问修改后的闭包”。

于 2009-07-06T12:52:21.137 回答
0

关闭

于 2009-07-06T09:48:21.457 回答
0

是的,这是捕获;您也可以使用“关闭”。这里有几个例句;

传递给 GenerateMenu 的委托捕获变量 x。

传递给 GenerateMenu 的委托是一个关闭 x 的 lambda。

您可能还想在谷歌上搜索“自由变量”和“绑定变量”这两个术语。

于 2009-07-06T10:00:02.573 回答
0

“将迭代变量分配给循环内的局部变量”

于 2011-01-18T23:53:56.427 回答