这个委托调用在这行代码(C#)中做什么?
这来自agsXMPP.Net程序集附带的示例。我已经阅读了有关委托的内容,但不确定这是否符合这一行代码(它等待登录,然后发送消息。我想我要了解的是,这个委托调用在这行代码(C#)中做什么?,c#,delegates,C#,Delegates,这来自agsXMPP.Net程序集附带的示例。我已经阅读了有关委托的内容,但不确定这是否符合这一行代码(它等待登录,然后发送消息。我想我要了解的是,delegate(0)以我能理解的简单术语实现这一点的原因 xmpp.OnLogin += delegate(object o) { xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); }; 这
delegate(0)
以我能理解的简单术语实现这一点的原因
xmpp.OnLogin += delegate(object o) {
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};
这就是创建一个匿名函数。此功能是在C#2.0中引入的。它作为一个匿名方法,因此您不需要在其他地方声明它。它非常有用
在这种情况下,它所做的是将该方法附加到由
onLogin
事件触发的操作列表中。它与
xmpp.OnLogin += EventHandler(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()语句,编译器会认为你在一个赋值语句的中间执行一个动作并给你错误。 同意Abe,这是一个匿名方法。匿名方法只是一个没有名字的方法,它可以作为参数参数提供。
显然,OnLogin对象是一个事件;使用+=运算符可以确保每当引发OnLogin事件时,都会执行上面匿名委托指定的方法。基本上,{}内的代码将在“OnLogin”事件发生时运行xmpp事件的事件被激发。根据名称,我猜该事件在登录过程中的某个点激发
语法:
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);
}
正如Abe所指出的,此代码正在创建一个匿名函数。这:
xmpp.OnLogin += delegate(object o)
{
xmpp.Send(
new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?"));
};
在较旧版本的.Net中可以按如下方式完成(我排除了类声明等,只保留了基本元素):
在任何一种情况下,您所做的都是将您的方法关联起来,以便在触发xmpp OnLogin事件时运行。OnLogin
在xmpp上可能是这样声明的事件:
public event LoginEventHandler OnLogin;
其中LoginEventHandler
为委托类型,可能声明为:
public delegate void LoginEventHandler(Object o);
这意味着为了订阅事件,您需要提供一个与LoginEventHandler
委托签名匹配的方法(或/)
在您的示例中,使用delegate
关键字传递匿名方法:
xmpp.OnLogin += delegate(object o)
{
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};
匿名方法与OnLogin
事件(void返回类型+一个对象参数)所需的委托签名相匹配。您还可以利用删除object o
参数,因为它不在匿名方法主体内使用
xmpp.OnLogin += delegate
{
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};
这不完全一样,因为在匿名方法中,您可以访问定义委托的作用域的局部变量。我认为在EventHandler之前需要一个新的。我相信EventHandler需要一个EventArgs参数。您需要声明一个只需要一个对象的新委托类型rameter,我想不管怎样!看Remi的回答它不是为了在sintaxis中完美,它是为了阐明这个概念有趣的是,在这里所有优秀的答案中,最模糊的一个被挑出来了。
xmpp.OnLogin += delegate
{
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};