2008-09-16 41 views
4

这是来自agsXMPP .Net程序集附带的示例。我已经阅读了代表,但是我不确定它是如何适合这行代码的(它等待登录发生,然后发送一条消息。我想我正在寻找的是理解为什么delegate(0)实现这一点,在那种简单来说,我可以理解。在这行代码(C#)中做这个委托调用是什么?

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

回答

1

delegate(object o){..}告诉编译器打包无论是括号内为稍后执行的对象,在这种情况下,当OnLogin被解雇。如果没有delegate()声明,编译器会认为您正在绑定在assigmim语句的中间执行某个操作,并为您提供错误。

0

即创建一个匿名的功能。该功能引入C#2.0中

0

它作为一个匿名方法,让你不需要在其他地方声明它非常有用

它在这种情况下的作用是将该方法附加到操作列表t因为onLogin事件而被触发。

4

这是完全一样的

xmpp.OnLogin += EventHandler(MyMethod); 

其中的MyMethod是

public void MyMethod(object o) 
{ 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
} 
+0

嗯,它不完全相同,因为在匿名方法中,您可以访问定义委托的作用域的局部变量。 – Ishmaeel 2008-09-16 14:45:55

+0

你是对的,虽然在这个例子中它是 – juan 2008-09-16 14:47:08

0

同意安倍,这是一个匿名方法。匿名方法就是这样 - 一个没有名字的方法,可以作为参数参数提供。

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

0

基本上,{}中的代码将在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?")); 
    } 
} 
0

您正在订阅xpppp中的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); 
    } 
2

正如安倍指出,此代码创建一个匿名函数。这个:


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

在旧版本中可能已经完成。净(我已经排除类的声明和这样的,只是不停的基本要素):


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事件被触发运行。

2

OnLogin上XMPP可能是一个事件的声明如下:

public event LoginEventHandler OnLogin; 

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

public delegate void LoginEventHandler(Object o); 

这意味着,为了订阅事件,您需要提供与LoginEventHandler委托签名匹配的方法(或anonymous method/lambda expression)。

在你的榜样,你通过使用delegate关键字匿名方法:

​​

匿名方法由OnLogin事件(返回类型为void +一个对象参数)预期的委托签名相匹配。您还可以删除object o参数,利用contravariance,因为它不在匿名方法内部使用。

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