トップ回答者
独自イベントの実装について(delegateの有無)

質問
-
独自イベントの実装の仕方なのですが、次の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
回答
-
明示的にデリゲートを指定しているかどうかの違いだけで、
実際には、デリゲートを指定しなければ、暗黙にSystem.EventHandlerデリゲートが使用されるので、
動作上の違いはありません。
明示的にデリゲートを指定する場合は、(object, EventArgs)以外の引数を受け付ける
イベントを定義することも可能です。
#まったくの自由だったか、(object, EventArgsの派生クラス)だけだったか忘れました・・・
(object, EventArgsの派生クラス)を引数に持つイベントを定義するのであれば
SystemEventHandler<T>デリゲートを使うこともできます。
すべての返信
-
明示的にデリゲートを指定しているかどうかの違いだけで、
実際には、デリゲートを指定しなければ、暗黙にSystem.EventHandlerデリゲートが使用されるので、
動作上の違いはありません。
明示的にデリゲートを指定する場合は、(object, EventArgs)以外の引数を受け付ける
イベントを定義することも可能です。
#まったくの自由だったか、(object, EventArgsの派生クラス)だけだったか忘れました・・・
(object, EventArgsの派生クラス)を引数に持つイベントを定義するのであれば
SystemEventHandler<T>デリゲートを使うこともできます。
-
囚人さん、ネットクラゲさん、回答ありがとうございます。
お2人の回答で、疑問もすっきり解決しました。
「System.EventHandler」がdelegate型で宣言されていたとは、調べが足りませんでした。
>(object, EventArgsの派生クラス)を引数に持つイベントを定義するのであれば
>SystemEventHandler<T>デリゲートを使うこともできます。
この質問をUpした後、イベントハンドラへ独自の引数を渡す方法もいろいろ試していまして、
「パターン1」の手法では、うまくできたのですが、「パターン2」ではできなくて、この質問が
解決した後、改めて質問させて頂こうかと考えていたので、先読みの回答で助かりました。
ありがとうございました。