这个代理调用在这行代码(C#)中做了什么?

时间:2008-09-16 14:37:12

标签: c# delegates

这是来自agsXMPP .Net程序集的示例。我已经阅读了代理,但我不确定如何适应这一行代码(等待登录发生,然后发送消息。我想我正在寻找的是理解为什么{ {1}}用我能理解的简单术语来实现这一点。

delegate(0)

9 个答案:

答案 0 :(得分: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?")); 
}

答案 1 :(得分:2)

正如Abe所说,这段代码正在创建一个匿名函数。这样:


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事件触发时的运行相关联。

答案 2 :(得分:2)

xmpp上的

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

public event LoginEventHandler OnLogin;

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

public delegate void LoginEventHandler(Object o);

这意味着,要订阅该活动,您需要提供与LoginEventHandler代理签名匹配的方法(或anonymous method / lambda expression)。

在您的示例中,您使用delegate关键字传递匿名方法:

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

匿名方法匹配OnLogin事件所期望的委托签名(void返回类型+一个对象参数)。您还可以删除利用contravarianceobject o参数,因为它未在匿名方法体内使用。

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

答案 3 :(得分:1)

delegate(object o){..}告诉编译器将括号内的任何内容打包为稍后要执行的对象,在这种情况下触发OnLogin。如果没有delegate()语句,编译器会认为您正在尝试在assignemnt语句中执行操作并为您提供错误。

答案 4 :(得分:0)

这就是创建一个匿名函数。此功能是在C#2.0中引入的

答案 5 :(得分:0)

它用作匿名方法,因此您无需在其他位置声明它。这非常有用。

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

答案 6 :(得分:0)

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

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

答案 7 :(得分: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?"));
  }
}

答案 8 :(得分:0)

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