此委托调用在此代码行(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中引入的


推荐阅读

    linux命令行模式登录?

    linux命令行模式登录?,系统,密码,信息,状态,情况,终端,环境,管理,电脑,位置,l

    linux外部命令调用?

    linux外部命令调用?,系统,软件,标准,命令,盘中,管理,外部,进程,程序,内存,lin

    linux登录系统的命令?

    linux登录系统的命令?,系统,工作,地址,名称,网络,密码,信息,服务,软件,资料,l

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    linux远程登录的命令?

    linux远程登录的命令?,地址,密码,系统,名称,服务,网络,命令,软件,工作,服务

    linux命令行登录上网?

    linux命令行登录上网?,网络,系统,工具,设备,地址,最新,工作,数据,网址,信息,l

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    linux系统命令调用?

    linux系统命令调用?,系统,单位,工具,工作,管理,地址,权威,密码,电脑,信息,怎

    linux调用上一条命令?

    linux调用上一条命令?,系统,命令,一致,数字,名称,网上,电脑,目录,空格,终端,l

    linux用户登录的命令?

    linux用户登录的命令?,系统,信息,工作,地址,时间,密码,名称,命令,电脑,软件,l

    linux命令行调用程序?

    linux命令行调用程序?,工具,环境,代码,初级,工程,系统,网上,服务,管理,发行,l

    linux命令用账号登录?

    linux命令用账号登录?,密码,系统,管理,地址,软件,联系方式,状态,用户,用户

    linux命令界面登录?

    linux命令界面登录?,系统,工具,密码,数字,设备,终端,软件,工作,服务,状态,lin

    脚本调用linux命令?

    脚本调用linux命令?,代码,系统,工作,底部,脚本,位置,环境,行用,官网,标准,typ

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux远程登录命令?

    linux远程登录命令?,软件,地址,系统,服务,名称,网站,数字,网络,电脑,密码,如

    linux免密钥登录命令?

    linux免密钥登录命令?,密码,数据,流程,服务,标准,网络,网上,认证,证书,代码,L