2009年9月9日水曜日

イベントの実装

イベントを独自に実装するにはデリゲートを使います。
注意点は、イベントを発行する前に if (null != MyEvent) { ... } のように
呼び出し元でイベントハンドラーが追加されていることを
必ず確認することです。

public class EventClass
{
    public void DoSomething()
    {
        // イベントハンドラーの登録を確認します。
        if (null != MyEvent)
        {
            MyEvent(this, new MyEventArgs("Occurred MyEvent"));
        }
    }

    // イベントデリゲート
    public delegate void MyEventHandler(object sender, MyEventArgs e);
    // イベント
    public event MyEventHandler MyEvent;
}

// EventArgs を継承して独自のイベントデータを定義します。
public class MyEventArgs : EventArgs
{
    public MyEventArgs(string myVar)
    {
        this.myVar = myVar;
    }

    public string MyVar
    {
        get { return myVar; }
        set { myVar = value; }
    }

    private string myVar;
}

// イベントを受け取る側の実装
EventClass eventClass = new EventClass();
// イベントハンドラーを追加します。
eventClass.MyEvent += delegate(object sender, MyEventArgs e)
{
    MessageBox.Show(e.MyVar);
};

eventClass.DoSomething();








eventClass.MyEvent に追加したデリゲートが実行され、
メッセージボックスが表示されます。

ただ、今回のようにイベントの引数が object と EventArgs の派生クラスの
2 つで構成されるときは
System.EventHandler<TEventargs> デリゲートを使用し、
次のように書くこともできます。(1 ステップ減るだけですが)

public class EventClass
{
    public void DoSomething()
    {
        if (null != MyEvent)
        {
            MyEvent(this, new MyEventArgs("Occurred MyEvent"));
        }
    }

    public event EventHandler<MyEventArgs> MyEvent;
}

0 件のコメント:

コメントを投稿