4

这是来自 agsXMPP .Net 程序集随附的示例。我已经阅读了代表,但不确定这与这行代码(等待登录发生,然后发送消息。我想我正在寻找的是理解为什么delegate(0)完成这个,用我能理解的那种简单的话来说。

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

9 回答 9

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?")); 
}
于 2008-09-16T14:41:07.157 回答
2

正如 Abe 所指出的,这段代码正在创建一个匿名函数。这:


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

在旧版本的 .Net 中将按以下方式完成(我已经排除了类声明等,只保留了基本元素):


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 事件时关联您的方法以运行。

于 2008-09-16T14:47:33.117 回答
2

OnLogin在 xmpp 上可能是这样声明的事件:

public event LoginEventHandler OnLogin;

哪里LoginEventHandler是委托类型可能声明为:

public delegate void LoginEventHandler(Object o);

这意味着为了订阅事件,您需要提供与委托签名匹配的方法(或匿名方法/ lambda 表达式) 。LoginEventHandler

delegate在您的示例中,您使用关键字传递了一个匿名方法:

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

匿名方法与事件预期的委托签名相匹配OnLogin(void 返回类型 + 一个对象参数)。您还可以利用逆变来删除object o参数,因为它不在匿名方法体内使用。

xmpp.OnLogin += delegate
                { 
                    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
                              MessageType.chat,
                              "Hello, how are you?")); 
                };
于 2008-09-16T14:57:08.600 回答
1

告诉编译器将delegate(object o){..}括号内的任何内容打包为稍后执行的对象,在这种情况下OnLogin是何时触发。如果没有该delegate()语句,编译器会认为您要在assignemnt 语句中间执行操作并给您错误。

于 2008-09-16T14:42:04.190 回答
0

那是创建一个匿名函数。此功能是在 C# 2.0 中引入的

于 2008-09-16T14:38:47.133 回答
0

它用作匿名方法,因此您无需在其他地方声明它。它非常有用。

在这种情况下,它所做的就是将该方法附加到因onLogin事件而触发的操作列表中。

于 2008-09-16T14:40:42.167 回答
0

同意安倍的观点,这是一种匿名方法。匿名方法就是这样 - 没有名称的方法,可以作为参数参数提供。

显然 OnLogin 对象是一个事件;使用 += 运算符可确保在引发 OnLogin 事件时执行上述匿名委托指定的方法。

于 2008-09-16T14:42:39.323 回答
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?"));
  }
}
于 2008-09-16T14:43:13.113 回答
0

您正在订阅 xmpp 中的 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);
   }
于 2008-09-16T14:44:13.250 回答