2011-05-30 55 views
3

鑑於以下情況,何時綁定了fooC#關閉綁定

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

是否綁定然後執行匿名方法,或者當方法被定義時?

回答

4

foo完全沒有綁定,因爲它在匿名方法的內部。它將調用Messages.SelectedItem。如果Messages是一個實例屬性,那麼綁定的是'this'實例,它用於獲取消息。

+0

+1 - 這是正確的答案 – 2011-05-30 20:58:52

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值。

+0

有什麼可以說「我對此毫不知情」達林? – Bastardo 2011-05-30 20:36:00

+0

@BurnAfterReading,我不知道誰今年會贏得羅蘭加洛斯。儘管我是Djoko的忠實粉絲,但我敢打賭費德勒。 – 2011-05-30 20:37:21

+0

:D我也會爲費德勒打賭,他是我的最愛。讓我們看看結束時間給我們帶來了什麼。 – Bastardo 2011-05-30 20:43:50