2008-09-16 60 views
4

這是來自agsXMPP .Net程序集附帶的示例。我已經閱讀了代表,但是我不確定它是如何適合這行代碼的(它等待登錄發生,然後發送一條消息。我想我正在尋找的是理解爲什麼delegate(0)實現這一點,在那種簡單來說,我可以理解。在這行代碼(C#)中做這個委託調用是什麼?

xmpp.OnLogin += delegate(object o) { 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
    MessageType.chat, 
    "Hello, how are you?")); 
}; 

回答

1

delegate(object o){..}告訴編譯器打包無論是括號內爲稍後執行的對象,在這種情況下,當OnLogin被解僱。如果沒有delegate()聲明,編譯器會認爲您正在綁定在assigmim語句的中間執行某個操作,併爲您提供錯誤。

0

即創建一個匿名的功能。該功能引入C#2.0中

0

它作爲一個匿名方法,讓你不需要在其他地方聲明它非常有用

它在這種情況下的作用是將該方法附加到操作列表t因爲onLogin事件而被觸發。

4

這是完全一樣的

xmpp.OnLogin += EventHandler(MyMethod); 

其中的MyMethod是

public void MyMethod(object o) 
{ 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
} 
+0

嗯,它不完全相同,因爲在匿名方法中,您可以訪問定義委託的作用域的局部變量。 – Ishmaeel 2008-09-16 14:45:55

+0

你是對的,雖然在這個例子中它是 – juan 2008-09-16 14:47:08

0

同意安倍,這是一個匿名方法。匿名方法就是這樣 - 一個沒有名字的方法,可以作爲參數參數提供。

顯然OnLogin對象是一個事件;使用+ =操作符可確保在引發OnLogin事件時執行上述匿名委託指定的方法。

0

基本上,{}中的代碼將在xmpp事件的「OnLogin」事件觸發時運行。根據名稱,我猜想事件在登錄過程中的某個時刻觸發。

的語法:

delegate(object o) { statements; } 

是稱爲匿名方法。您的問題中的代碼將等同於此:

public class MyClass 
{ 
    private XMPPObjectType xmpp; 
    public void Main() 
    { 
    xmpp.OnLogin += MyMethod; 
    } 
    private void MyMethod(object o) 
    { 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
    } 
} 
0

您正在訂閱xpppp中的OnLogin事件。

這意味着當xmpp觸發此事件時,匿名委託內的代碼將觸發。它是一種優雅的回調方式。

在XMPP協議中,這樣的事情是怎麼回事:

// Check to see if we should fire the login event 
    // ALso check to see if anything is subscribed to OnLogin 
    // (It will be null otherwise) 
    if (loggedIn && OnLogin != null) 
    { 
     // Anyone subscribed will now receive the event. 
     OnLogin(this); 
    } 
2

正如安倍指出,此代碼創建一個匿名函數。這個:


xmpp.OnLogin += delegate(object o) 
    { 
     xmpp.Send(
     new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
    }; 

在舊版本中可能已經完成。淨(我已經排除類的聲明和這樣的,只是不停的基本要素):


delegate void OnLoginEventHandler(object o); 

public void MyLoginEventHandler(object o) 
{ 
     xmpp.Send(
     new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
} 

[...] 

xmpp.OnLogin += new OnLoginEventHandler(MyLoginEventHandler); 

你正在做的任何一種情況下什麼是關聯你的方法時,XMPP OnLogin事件被觸發運行。

2

OnLogin上XMPP可能是一個事件的聲明如下:

public event LoginEventHandler OnLogin; 

其中LoginEventHandler是委託類型可能聲明爲:

public delegate void LoginEventHandler(Object o); 

這意味着,爲了訂閱事件,您需要提供與LoginEventHandler委託簽名匹配的方法(或anonymous method/lambda expression)。

在你的榜樣,你通過使用delegate關鍵字匿名方法:

​​

匿名方法由OnLogin事件(返回類型爲void +一個對象參數)預期的委託簽名相匹配。您還可以刪除object o參數,利用contravariance,因爲它不在匿名方法內部使用。

xmpp.OnLogin += delegate 
       { 
        xmpp.Send(new Message(new Jid(JID_RECEIVER), 
           MessageType.chat, 
           "Hello, how are you?")); 
       };