none
独自イベントの実装について(delegateの有無) RRS feed

  • 質問

  • 独自イベントの実装の仕方なのですが、次の2つの仕方、違いはなんなんでしょうか。

     

    パターン1(delegate有)

            public delegate void MyEventDelegate(object sender, EventArgs e);
            public event MyEventDelegate MyEvent;

            protected virtual void OnMyEvent(EventArgs e)
            {
              if (MyEvent != null)
              {
                 MyEvent(this, e);
              }
            }

    パターン2(delegate無)

            event EventHandler MyEventHandler;

            public event EventHandler MyEvent
            {
                add    { MyEventHandler += value; }
                remove { MyEventHandler -= value; }
            }

            protected virtual void OnMyEvent(EventArgs e)
            {
              if (MyEventHandler != null)
              {
                 MyEventHandler(this, e);
              }
            }

    動作させてみた結果、イベントととしては共に機能しているように見えました。

     

    皆様、ご教授願えませんでしょうか。

    宜しくお願い致します。

     

    環境:

    Windows XP Home Edition SP2

    Visual C# 2005 Express Edition

    .NET Framework 2.0

    2008年3月20日 13:00

回答

  •  

    public event EventHandler MyEvent
    {
     add    {  }
     remove {  }
    }

    上記構文は、イベントの割り当て処理に特殊な事を行いたい場合に使います。

    例えば、Windows Forms のようにメモリ効率を考慮して、実際にイベントハンドラが割り当てられる内部変数を用意しない(ディクショナリにする)、
    WPF のようにアタッチイベントにして、大幅にアーキテクチャを変更する、などです。

    単に += -= するだけなら、何も変わりないでしょうね。

    2008年3月20日 14:06
  • 明示的にデリゲートを指定しているかどうかの違いだけで、

    実際には、デリゲートを指定しなければ暗黙にSystem.EventHandlerデリゲートが使用されるので、

    動作上の違いはありません。

     

    明示的にデリゲートを指定する場合は、(object, EventArgs)以外の引数を受け付ける

    イベントを定義することも可能です。

    #まったくの自由だったか、(object, EventArgsの派生クラス)だけだったか忘れました・・・

     

    (object, EventArgsの派生クラス)を引数に持つイベントを定義するのであれば

    SystemEventHandler<T>デリゲートを使うこともできます。

     

     

     

    2008年3月20日 14:26

すべての返信

  •  

    public event EventHandler MyEvent
    {
     add    {  }
     remove {  }
    }

    上記構文は、イベントの割り当て処理に特殊な事を行いたい場合に使います。

    例えば、Windows Forms のようにメモリ効率を考慮して、実際にイベントハンドラが割り当てられる内部変数を用意しない(ディクショナリにする)、
    WPF のようにアタッチイベントにして、大幅にアーキテクチャを変更する、などです。

    単に += -= するだけなら、何も変わりないでしょうね。

    2008年3月20日 14:06
  • 明示的にデリゲートを指定しているかどうかの違いだけで、

    実際には、デリゲートを指定しなければ暗黙にSystem.EventHandlerデリゲートが使用されるので、

    動作上の違いはありません。

     

    明示的にデリゲートを指定する場合は、(object, EventArgs)以外の引数を受け付ける

    イベントを定義することも可能です。

    #まったくの自由だったか、(object, EventArgsの派生クラス)だけだったか忘れました・・・

     

    (object, EventArgsの派生クラス)を引数に持つイベントを定義するのであれば

    SystemEventHandler<T>デリゲートを使うこともできます。

     

     

     

    2008年3月20日 14:26
  • 囚人さん、ネットクラゲさん、回答ありがとうございます。

     

    お2人の回答で、疑問もすっきり解決しました。

     

    「System.EventHandler」がdelegate型で宣言されていたとは、調べが足りませんでした。

     

     

    >(object, EventArgsの派生クラス)を引数に持つイベントを定義するのであれば

    >SystemEventHandler<T>デリゲートを使うこともできます。

     

    この質問をUpした後、イベントハンドラへ独自の引数を渡す方法もいろいろ試していまして、

    「パターン1」の手法では、うまくできたのですが、「パターン2」ではできなくて、この質問が

    解決した後、改めて質問させて頂こうかと考えていたので、先読みの回答で助かりました。

     

    ありがとうございました。

     

    2008年3月21日 0:29