2011-07-26 111 views
15

對不起,要求全部,但我是一個老手Vb.net傢伙誰轉移到C#。我有下面這段代碼,當(在這種情況下)postAsync方法被激發時似乎激活。我只是不;噸瞭解代碼的作用(如下): -什麼是+ =(o,arg)=>實際實現?

app.PostCompleted += 
    (o, args) => 
    { 
     if (args.Error == null) 
     { 
      MessageBox.Show("Picture posted to wall successfully."); 
     } 
     else 
     { 
      MessageBox.Show(args.Error.Message); 
     } 
    }; 

如果有人能說明什麼+ =(O,參數)=>實際上acheiving我會如此感激.. ..

非常感謝提前。 Tim

回答

26

(o,args) =>定義了一個lambda表達式,它帶有兩個名爲oargs的參數。這些參數的類型根據PostCompleted的類型推斷(如果PostCompletedEventHandler,那麼它們將分別是類型ObjectEventArgs)。表達式的主體隨後在=>之後。

結果是作爲處理程序添加到PostCompleted

因此,它是寫一個更簡潔的方式:這是一個速記

app.PostCompleted += delegate(object o, EventArgs args) 
{ 
    // ... 
}; 

void YourHandler(object o, EventArgs args) 
{ 
    // ... 
} 

// ... 

app.PostCompleted += YourHandler; 
+8

這就是'app.PostCompleted + = new EventHandler(YourHandler)'的簡寫本身;'。 – Shibumi

+0

你甚至不需要有「新的EventHandler」。 C#編譯器足夠聰明,可以推斷出使用哪個委託。所以更短的快捷方式是'app.PostCompleted + = YourHandler;' – Sung

+4

@Sung我想這正是他所說的。 –

8

這是使用lambda表達式爲PostCompleted事件添加的處理程序。它類似於

app.PostCompleted += MyHandler; 

    // ... 

    private void MyHandler(object sender, EventArgs e) { 
     // ... 
    } 

但是,當使用lambda表達式時,不能輕鬆地分離處理程序。

5

這是用於定義POST完成事件的事件處理程序委託速記:

app.PostCompleted += delegate(object o, EventArgs args) { 
    // ... 
}; 

另請參閱Anonymous Methods

3

假設PostCompleted是一個事件,你基本上使用lambda表示法創建一個事件處理程序。

此代碼剪斷等效於:

app.PostCompleted += delegate (o, args) 
{ 
    if (args.Error == null) 
    { 
     MessageBox.Show("Picture posted to wall successfully."); 
    } 
    else 
    { 
     MessageBox.Show(args.Error.Message); 
    } 
}; 
2

(o,args) =>部分是lambda expression,這是一個匿名函數。

+=部分分配要在事件觸發時調用的lambda表達式。

+0

Thnaks爲MSDN鏈接..... –

3

的vb.net相當於是這樣的:

AddHandler app.PostCompleted, Function(o, args) 
     ''# ... 
    End Function 

注意,這需要的Visual Studio 2010/.NET 4,但C#代碼工作早在Visual Studio 2008中/ .NET 3.5。

但這只是部分正確。在C#中,這是一種將方法定義爲事件處理程序的方法。在VB中。淨,您可以使用關鍵字Handles,因此實際相當於看起來更像是這樣的:

Public Sub App_PostCompleted(ByVal Sender as Object, ByVall e As EventArgs) Handles app.PostCompleted 
    ''# 
End Sub 

但是,即使這不是完全等同的,因爲你給的方法的名稱,可以從任何地方調用它。對C#代碼的唯一引用(並因此是調用它的唯一方式)是通過事件訂閱。