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

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

What is this delegate call doing in this line of code (C#)?

这是来自与agsXMPP .Net程序集一起的示例。 我已经阅读了委托,但是不确定这行代码是否适合(等待登录发生,然后发送消息。我想寻找的是对为什么< x0>以我可以理解的简单术语完成了此任务。

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

完全一样

1
xmpp.OnLogin += EventHandler(MyMethod);

MyMethod在哪里

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

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

1
public event LoginEventHandler OnLogin;

其中LoginEventHandler是代表类型,可能声明为:

1
public delegate void LoginEventHandler(Object o);

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

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

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

匿名方法与onLogin事件期望的委托签名匹配(无效的返回类型+一个对象参数)。您还可以利用反向性删除object o参数,因为该参数未在匿名方法主体中使用。

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

如安倍晋三所说,这段代码正在创建一个匿名函数。这个:

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

在.Net的较旧版本中将可以完成以下操作(我已经排除了类声明等,并且仅保留了基本元素):

1
2
3
4
5
6
7
8
9
10
11
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事件时运行的方法。


delegate(object o){..}告诉编译器将括号内的内容打包为以后要执行的对象,在这种情况下,将触发onLogin。如果没有delegate()语句,则编译器会认为您要在assignemnt语句的中间执行一个动作,并给您错误。


您正在xmpp中订阅OnLogin事件。

这意味着当xmpp触发此事件时,匿名委托中的代码将触发。具有回调的一种优雅方法。

在Xmpp中,正在进行这样的事情:

1
2
3
4
5
6
7
8
   // 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);
   }

基本上,当触发xmpp事件的" OnLogin"事件时,{}内部的代码将运行。根据名称,我猜想该事件会在登录过程中的某个时刻触发。

语法:

1
delegate(object o) { statements; }

是一种称为匿名方法的方法。您问题中的代码与此等效:

1
2
3
4
5
6
7
8
9
10
11
12
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?"));
  }
}

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

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


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

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


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


推荐阅读