这是来自与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中引入的