2013-05-14 78 views
4

我試圖理解應用程序中的代碼塊是什麼,但我遇到了一些C#我只是不明白。這行C#代碼實際上做了什麼?

在下面的代碼中,「controller.Progress + =」行後的代碼是幹什麼用的?

我以前沒見過這種語法,因爲我不知道構造函數的調用方式,我不能谷歌任何東西來找出這個語法的含義。例如,值s和p是什麼?他們是佔位符嗎?

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    using (var controller = new ApplicationDeviceController(e.Argument as SimpleDeviceModel)) 
    { 
     controller.Progress += 
      (s, p) => { (sender as BackgroundWorker).ReportProgress(p.Percent); }; 
     string html = controller.GetAndConvertLog(); 
     e.Result = html; 
    } 
} 

它看起來像它的附加功能的事件,但我只是不明白的語法(或者是什麼S和P),並有該代碼沒有有用intellsense。

+2

注意,由於'(發送方被作爲BackgroundWorker的)如果轉換失敗,並且將立即導致一個空引用異常,像這樣將寫它'將爲空更好地表達意圖(如果失敗則給出更有意義的異常):'{((BackgroundWorker)sender).ReportProgress(p.Percent); }' – 2013-05-14 14:29:17

回答

6

這是一個拉姆達表達式被分配給一個事件處理程序。

S和P是傳遞給函數的變量。你基本上定義了一個無名函數,它接收兩個參數。因爲C#知道controller.Progress事件需要一個具有兩個int和object類型參數的方法處理程序,所以它會自動假定這兩個變量是這些類型的。

你也可以這樣來定義這是

controller.Progress += (int s, object p)=> { ... } 

這是一樣的,如果你有一個方法定義來代替:

controller.Progress += DoReportProgress; 
.... 
public void DoReportProgress(int percentage, object obj) { .... } 
+0

謝謝...一個非常明確的解釋。接受爲答案。 – NickG 2013-05-14 14:33:08

3

它的電線了Progress事件的controller觸發BackgroundWorker'sReportProgress

更具體地說,(s, p)是事件處理程序方法的參數簽名,就像(object Sender, EventArgs e)

lambda expressions

3

這就是所謂的Anonymous Function

匿名函數是一種「內聯」語句或表達式,可用於需要委託類型的任何位置。您可以使用它來初始化一個已命名的委託或將其作爲方法參數傳遞給它,而不是命名的委託類型。

在你的情況下,它基本上連線你的Progress事件觸發ReportProgess函數。

通常情況下,它會被寫成這樣:

controller.Progress += new EventHandler(delegate (object sender, EventArgs a) { 
    (sender as BackgroundWorker).ReportProgress(p.Percent); 
}); 
3

其實這個代碼將拉姆達EXP的事件。在編譯時,將被轉換爲代表如下,

controller.Progress += new EventHandler(delegate (Object o, EventArgs a) { 
a.ReportProgress(p.Percent); 
      }); 
相關問題