在此代码行(C#)中,此委托调用是做什么的?
这是来自与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?")); };