根据以下情况,foo
何时被绑定?
System.Timer t = new System.Timer( (a)=>{
var foo = Messages.SelectedItem as FooBar;
});
匿名方法是在执行时绑定,还是定义时绑定?
System.Timer
类,会导致编译时出现错误,因此永远不会发生。假设您想要一个System.Threading.Timer,那么在调用此构造函数即定义方法时,闭包将被绑定/捕获。如果您想在执行方法时绑定它,则需要另一个构造函数重载并传递状态。var t = new System.Threading.Timer(a =>
{
var foo = a as FooBar;
}, Messages.SelectedItem, -1, -1);
Messages.SelectedItem
值。foo
根本没有绑定,因为它是匿名方法内部的变量。它将调用Messages.SelectedItem。如果Messages是一个实例属性,那么绑定的是'this'实例,这个实例被用来获取Messages。
foo
的值将被设置为Messages.SelectedItem
的当前值。在你答案的代码中,foo
的值被固定为构造函数调用时的Messages.SelectedItem
的值。然而,你说这个值将是“在此回调执行时存在的值”,这意味着不同。 - Ben Mfoo
根本没有被捕获——因为它在lambda中定义。相反,被捕获的对象是实现Messages
属性的对象——可能是this
。(换句话说,Dan Bryant是正确的。) - Ben Mfoo
是计时器回调的本地变量,因此我们无法谈论捕获
它。如果在此处闭包中捕获了某些内容,则为Messages.SelectedItem
属性/字段。此外,OP想知道何时绑定foo
变量,但我想他选择了不好的措辞,因为当回调执行时,foo
始终绑定。我想他想知道的是将此foo
变量分配给什么值。 - Darin Dimitrov