这个委托调用在这行代码(C#)中做什么?

这个委托调用在这行代码(C#)中做什么?,c#,delegates,C#,Delegates,这来自agsXMPP.Net程序集附带的示例。我已经阅读了有关委托的内容,但不确定这是否符合这一行代码(它等待登录,然后发送消息。我想我要了解的是,delegate(0)以我能理解的简单术语实现这一点的原因 xmpp.OnLogin += delegate(object o) { xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); }; 这

这来自agsXMPP.Net程序集附带的示例。我已经阅读了有关委托的内容,但不确定这是否符合这一行代码(它等待登录,然后发送消息。我想我要了解的是,
delegate(0)
以我能理解的简单术语实现这一点的原因

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

这就是创建一个匿名函数。此功能是在C#2.0中引入的。它作为一个匿名方法,因此您不需要在其他地方声明它。它非常有用


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

它与

xmpp.OnLogin += EventHandler(MyMethod);
我的方法在哪里

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

delegate(object o){..}
告诉编译器将括号内的任何内容打包为一个对象,以便稍后执行,在这种情况下,当触发
OnLogin
时。没有
delegate()语句,编译器会认为你在一个赋值语句的中间执行一个动作并给你错误。

同意Abe,这是一个匿名方法。匿名方法只是一个没有名字的方法,它可以作为参数参数提供。


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

基本上,{}内的代码将在“OnLogin”事件发生时运行xmpp事件的事件被激发。根据名称,我猜该事件在登录过程中的某个点激发

语法:

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?"));
  }
}

您正在订阅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);
   }

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


xmpp.OnLogin += delegate(object o) 
   { 
      xmpp.Send(
         new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
   };
在较旧版本的.Net中可以按如下方式完成(我排除了类声明等,只保留了基本元素):


在任何一种情况下,您所做的都是将您的方法关联起来,以便在触发xmpp OnLogin事件时运行。

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

public event LoginEventHandler OnLogin;
其中
LoginEventHandler
为委托类型,可能声明为:

public delegate void LoginEventHandler(Object o);
这意味着为了订阅事件,您需要提供一个与
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?")); 
                };

这不完全一样,因为在匿名方法中,您可以访问定义委托的作用域的局部变量。我认为在EventHandler之前需要一个新的。我相信EventHandler需要一个EventArgs参数。您需要声明一个只需要一个对象的新委托类型rameter,我想不管怎样!看Remi的回答它不是为了在sintaxis中完美,它是为了阐明这个概念有趣的是,在这里所有优秀的答案中,最模糊的一个被挑出来了。
xmpp.OnLogin += delegate
                { 
                    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
                              MessageType.chat,
                              "Hello, how are you?")); 
                };