C#Closure绑定

时间:2011-05-30 20:27:08

标签: c# closures

鉴于以下内容,何时foo绑定?

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

是否绑定了匿名方法,或者定义了方法?

2 个答案:

答案 0 :(得分:4)

从来没有,因为编译时错误,你会得到BCL中没有System.Timer类。假设你想要一个System.Threading.Timer,那么在调用这个构造函数时绑定/捕获闭包,即定义方法。如果要在执行方法时绑定它,则需要另一个constructor overload并传递状态。

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

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

答案 1 :(得分:4)

foo完全没有约束,因为它是匿名方法的内部。它将调用Messages.SelectedItem。如果Messages是一个实例属性,那么绑定的是'this'实例,它用于获取Messages。