イベント (event)

イベントはデリゲートに基づくため、そちらを理解する必要もあります。

イベントの登録

button.Click += new EventHandler( button_Click );

このときコールバックメソッドは、次のように定義します。

void button_Click( object sender, EventArgs e )
{
    MessageBox.Show( "ボタンがクリックされました。" );
}

複数のオブジェクトへの登録

同一のイベントハンドラをほかにも使用するならば、次のようにも記述できます。

EventHandler clickEventHandler = new EventHandler( button_Click );

button1.Click += clickEventHandler;
button2.Click += clickEventHandler;

コールバックメソッドの省略

匿名メソッド (Anonymous Methods) を使用することで、コールバックメソッドを省略できます。

button.Click += delegate( object sender, EventArgs e )
    { MessageBox.Show( "ボタンがクリックされました。" ); };

引数を使用しないならば、それを省略することともできます。

button.Click += delegate
    { MessageBox.Show( "ボタンがクリックされました。" ); };

独自のイベント定義

イベントに独自のデータを持たせる必要があるときには、System.EventArgsを継承してクラスを作成します。EventArgs クラス (System) - MSDN

class MoveEventArgs : System.EventArgs
{
    int position;

    public MoveEventArgs( int position )
    {
        this.position = position;
    }
}

イベント用のデリゲートの定義

イベントを処理するためのデリゲートを定義します。第2引数に、作成したイベントのクラスを持たせます。

delegate void MoveEventHandler( object source, MoveEventArgs e );

イベントの宣言

先に定義したデリゲートにevent修飾子を適用することで、イベントを宣言することができます。

class Foo
{
    event MoveEventHandler Move; // イベント宣言

    void Bar()
    {
        // イベント クラスのインスタンスの生成
        MoveEventArgs args = new MoveEventArgs( 123 );

        // イベントの発生
        Move( this, args );
    }
}

これを利用する側は、次のようにすることでイベントを受け取れます。

class Baz
{
    Foo foo;

    void Baz()
    {
        foo = new Foo();
        foo.Move += new MoveEventHandler( _move );
    }

    void _move( object sender, EventArgs e )
    {
    }
}

イベントアクセサ

イベントアクセサで、イベントへのアクセスを制御できます。

例えば次のようなイベント宣言があったとき、

public event MoveEventHandler Move;

これは次のように書き換えられます。

private MoveEventHandler _Move;

public event MoveEventHandler Move
{
    add
    {
        _Move += value;
    }

    remove
    {
        _Move -= value;
    }
}