このデリゲート呼び出しは、このコード行 (C#) で何をしているのでしょうか?

StackOverflow https://stackoverflow.com/questions/73024

  •  09-06-2019
  •  | 
  •  

質問

これは、agsXMPP .Net アセンブリに付属する例からのものです。デリゲートについて調べましたが、それがこのコード行 (ログオンが発生するのを待ってからメッセージを送信する) とどのように適合するのかわかりません。私が探しているのはその理由の理解だと思います delegate(0) 私が理解できる簡単な言葉でこれを達成します。

xmpp.OnLogin += delegate(object o) { 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
    MessageType.chat, 
    "Hello, how are you?")); 
};
役に立ちましたか?

解決

delegate(object o){..} 括弧内にあるものはすべて、後で実行されるオブジェクトとしてパッケージ化するようにコンパイラーに指示します。この場合、 OnLogin 解雇される。なしで delegate() ステートメントを使用すると、コンパイラーは、assignment ステートメントの途中でアクションを実行しようとしていると判断し、エラーを返します。

他のヒント

まったく同じです

xmpp.OnLogin += EventHandler(MyMethod);

MyMethod の場所

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

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 イベントが発生したときに実行するメソッドを関連付けることができます。

OnLogin on 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 戻り値 + 1 つのオブジェクト引数)。を削除することもできます object o パラメータを利用して、 反変性, 匿名メソッド本体内では使用されないためです。

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

それは匿名関数を作成することです。この機能は C# 2.0 で導入されました

これは匿名メソッドとして機能するため、他の場所で宣言する必要はありません。とても便利です。

その場合に行うことは、そのメソッドを、次の理由でトリガーされるアクションのリストにアタッチすることです。 onLogin イベント。

安倍氏と同意、これは匿名の方法だ。匿名メソッドとは、パラメータの引数として指定できる名前のないメソッドです。

明らかに、OnLogin オブジェクトはイベントです。+= 演算子を使用すると、OnLogin イベントが発生するたびに、上記の匿名デリゲートで指定されたメソッドが確実に実行されます。

基本的に、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?"));
  }
}

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);
   }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top