鑑於以下情況,何時綁定了foo
?C#關閉綁定
System.Timer t = new System.Timer((a)=>{
var foo = Messages.SelectedItem as FooBar;
});
是否綁定然後執行匿名方法,或者當方法被定義時?
鑑於以下情況,何時綁定了foo
?C#關閉綁定
System.Timer t = new System.Timer((a)=>{
var foo = Messages.SelectedItem as FooBar;
});
是否綁定然後執行匿名方法,或者當方法被定義時?
foo
完全沒有綁定,因爲它在匿名方法的內部。它將調用Messages.SelectedItem。如果Messages是一個實例屬性,那麼綁定的是'this'實例,它用於獲取消息。
從來沒有,因爲在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 - 這是正確的答案 – 2011-05-30 20:58:52