4

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

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

9 に答える 9

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?")); 
}
于 2008-09-16T14:41:07.157 に答える
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 イベントが発生したときに実行するメソッドを関連付けています。

于 2008-09-16T14:47:33.117 に答える
2

OnLoginxmpp では、おそらく次のように宣言されたイベントです。

public event LoginEventHandler OnLogin;

whereLoginEventHandlerは、おそらく次のように宣言されたデリゲート型です。

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 つのオブジェクト引数) と一致します。匿名メソッド本体内で使用されていないため、 contravarianceobject oを利用してパラメーターを削除することもできます。

xmpp.OnLogin += delegate
                { 
                    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
                              MessageType.chat,
                              "Hello, how are you?")); 
                };
于 2008-09-16T14:57:08.600 に答える
1

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

于 2008-09-16T14:42:04.190 に答える
0

つまり、無名関数を作成しています。この機能は C# 2.0 で導入されました

于 2008-09-16T14:38:47.133 に答える
0

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

その場合に行うことは、onLoginイベントによってトリガーされるアクションのリストにそのメソッドを添付することです。

于 2008-09-16T14:40:42.167 に答える
0

阿部に同意、これは匿名の方法です。匿名メソッドは、名前のないメソッドであり、パラメーター引数として指定できます。

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

于 2008-09-16T14:42:39.323 に答える
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?"));
  }
}
于 2008-09-16T14:43:13.113 に答える
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);
   }
于 2008-09-16T14:44:13.250 に答える