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

时间:2020-03-05 18:56:08  来源:igfitidea点击:

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

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

解决方案

回答

那就是创建一个匿名函数。此功能是C2.0中引入的

回答

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

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

回答

完全一样

xmpp.OnLogin += EventHandler(MyMethod);

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()语句,编译器会认为我们想在一个assignemnt语句的中间执行一个动作,并给我们错误。

回答

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

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

回答

基本上,当触发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?"));
  }
}

回答

我们正在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);
   }

回答

正如安倍指出的那样,这段代码正在创建一个匿名函数。这:

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

回答

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

public event LoginEventHandler OnLogin;

其中LoginEventHandler为委托类型,可能声明为:

public delegate void LoginEventHandler(Object o);

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

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

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

匿名方法与OnLogin事件期望的委托签名匹配(无效返回类型+一个对象参数)。我们还可以利用相反性删除`object o'参数,因为它没有在匿名方法主体中使用。

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