C# 闭包绑定

3

根据以下情况,foo 何时被绑定?

 System.Timer t = new System.Timer( (a)=>{
    var foo = Messages.SelectedItem as FooBar;
 });

匿名方法是在执行时绑定,还是定义时绑定?

2个回答

4
由于BCL中没有System.Timer类,会导致编译时出现错误,因此永远不会发生。假设您想要一个System.Threading.Timer,那么在调用此构造函数即定义方法时,闭包将被绑定/捕获。如果您想在执行方法时绑定它,则需要另一个构造函数重载并传递状态。
var t = new System.Threading.Timer(a =>
{
    var foo = a as FooBar;
}, Messages.SelectedItem, -1, -1);

现在,当回调函数运行时,它将使用此回调执行时的 Messages.SelectedItem 值。

我也会支持费德勒,他是我的最爱。让我们看看最终结果会带给我们什么。 - Bastardo
@Darin:也许我理解错了,但是你的解释对我来说似乎是相反的。在OP的情况下,每次方法执行时,foo的值将被设置为Messages.SelectedItem的当前值。在你答案的代码中,foo的值被固定为构造函数调用时的Messages.SelectedItem的值。然而,你说这个值将是“在此回调执行时存在的值”,这意味着不同。 - Ben M
@Ben M,我的英语太差了,甚至不确定是否理解你的评论 :-) 但我猜你一定是对的,关于我选择词汇不当。 - Darin Dimitrov
1
@Darin:这对我来说是个惊喜。无论如何,答案是foo根本没有被捕获——因为它在lambda中定义。相反,被捕获的对象是实现Messages属性的对象——可能是this。(换句话说,Dan Bryant是正确的。) - Ben M
@Ben M,foo是计时器回调的本地变量,因此我们无法谈论捕获它。如果在此处闭包中捕获了某些内容,则为Messages.SelectedItem属性/字段。此外,OP想知道何时绑定foo变量,但我想他选择了不好的措辞,因为当回调执行时,foo始终绑定。我想他想知道的是将此foo变量分配给什么值。 - Darin Dimitrov
显示剩余3条评论

4

foo根本没有绑定,因为它是匿名方法内部的变量。它将调用Messages.SelectedItem。如果Messages是一个实例属性,那么绑定的是'this'实例,这个实例被用来获取Messages。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接