【问题标题】:What is this delegate call doing in this line of code (C#)?这个委托调用在这行代码(C#)中做了什么?
【发布时间】:2008-09-16 14:37:12
【问题描述】:

这是来自 agsXMPP .Net 程序集附带的示例。我已经阅读了代表,但不确定这如何与这行代码相匹配(等待登录发生,然后发送消息。我想我正在寻找的是理解为什么@ 987654321@ 做到了这一点,用我能理解的简单术语。

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

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    完全一样

    xmpp.OnLogin += EventHandler(MyMethod);
    

    MyMethod 在哪里

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

    【讨论】:

    • 嗯,不完全一样,因为在匿名方法中,您可以访问定义委托的范围内的局部变量。
    • 我认为在 EventHandler 之前需要一个新的。而且我相信 EVentHandler 需要一个 EventArgs 参数。你需要声明一个新的委托类型,它只需要一个对象参数,我想无论如何!查看雷米的回答
    • 这并不是为了在 sintaxis 中完美,而是为了说明这个概念
    【解决方案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 事件被触发时运行。

    【讨论】:

      【解决方案3】:

      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 返回类型+一个对象参数)。您还可以利用contravariance 删除object o 参数,因为它不在匿名方法体内使用。

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

      【讨论】:

        【解决方案4】:

        delegate(object o){..} 告诉编译器将括号内的所有内容打包为稍后执行的对象,在这种情况下,当OnLogin 被触发时。如果没有delegate() 语句,编译器会认为你在执行一个assignemnt 语句中间的操作并给你错误。

        【讨论】:

        • 有趣的是,在这里所有优秀的答案中,最模糊的一个被选中了。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          它用作匿名方法,因此您无需在其他地方声明它。很有用。

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多