イベント (C# と Java の比較)

更新 : 2007 年 11 月

イベントは、クラスからオブジェクトのユーザーに対して、そのオブジェクトに関連する何かが発生したときに (グラフィカル ユーザー インターフェイスのコントロールをクリックした場合などに)、通知する 1 つの方法です。この通知をイベントの発生と言います。イベントを発生させるオブジェクトをイベント ソースまたはイベント送信元と言います。

Java でのイベント処理は、通常、カスタム リスナ クラスを実装して行いますが、C# では、イベント処理にデリゲートを使用できます。デリゲートは、メソッドをカプセル化する型です。デリゲートをメソッドで初期化すると、デリゲートはそのメソッドとまったく同じように動作し、() 演算子で呼び出すことができます。デリゲートは C++ の関数ポインタに似ていますが、タイプ セーフです。

デリゲートは、パラメータと戻り値を指定して他のメソッドと同じように使用できます。この例を次に示します。

public delegate int ReturnResult(int x, int y);

デリゲートの詳細については、「デリゲート (C# プログラミング ガイド)」を参照してください。

イベントには、メソッドと同様に、名前とパラメータ リストを含むシグネチャがあります。このシグネチャは、次のようにデリゲート型で定義します。

public delegate void MyEventHandler(object sender, System.EventArgs e);

Windows ユーザー インターフェイス プログラミングでは、イベントのソースを参照するオブジェクトを最初のパラメータにし、そのイベントに関連するデータを保持するオブジェクトを 2 番目のパラメータにするのが一般的です。ただし、このようなデザインは、C# 言語によって要求も強制もされません。イベントのシグネチャは、void を返す限りは、有効なデリゲート シグネチャと同じにできます。

イベントは、event キーワードを使用して、次のように宣言できます。

public event MyEventHandler TriggerIt;

イベントを発生させるには、イベントの発生時に呼び出すメソッドを次のように定義します。

public void Trigger()
{
    TriggerIt();
}

イベントを発生させるために、デリゲートを呼び出し、イベントに関連するパラメータを渡します。これで、デリゲートが、イベントに追加されているすべてのハンドラを呼び出します。各イベントには、イベントを受け取る複数のハンドラを割り当てることができます。この場合、イベントは各レシーバを自動的に呼び出します。イベントを発生させるには、レシーバの数には関係なく、イベントを 1 回だけ呼び出します。

クラスでイベントを受け取る場合は、そのイベントをサブスクライブします。イベントをサブスクライブするには、次のように、+= 演算子を使用してイベントにデリゲートを追加します。

myEvent.TriggerIt += myEvent.MyMethod;

イベントのサブスクライブを解除するには、次のように、-= 演算子を使用してイベントからデリゲートを削除します。

myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);

イベントの詳細については、「イベント (C# プログラミング ガイド)」を参照してください。

ms228499.alert_note(ja-jp,VS.90).gifメモ :

C# 2.0 では、デリゲートは、名前付きメソッドと匿名メソッドの両方をカプセル化できます。匿名メソッドの詳細については、「匿名メソッド (C# プログラミング ガイド)」を参照してください。

サンプル

説明

次の例では、3 つのメソッドが関連付けられたイベントを定義します。イベントがトリガされると、それらのメソッドが実行されます。1 つのメソッドはイベントから削除され、イベントが改めてトリガされます。

コード

// Declare the delegate handler for the event:
public delegate void MyEventHandler();

class TestEvent
{
    // Declare the event implemented by MyEventHandler.
    public event MyEventHandler TriggerIt;

    // Declare a method that triggers the event:
    public void Trigger()
    {
        TriggerIt();
    }
    // Declare the methods that will be associated with the TriggerIt event.
    public void MyMethod1()
    {
        System.Console.WriteLine("Hello!");
    }
    public void MyMethod2()
    {
        System.Console.WriteLine("Hello again!");
    }
    public void MyMethod3()
    {
        System.Console.WriteLine("Good-bye!");
    }

    static void Main()
    {
        // Create an instance of the TestEvent class.
        TestEvent myEvent = new TestEvent();

        // Subscribe to the event by associating the handlers with the events:
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
        // Trigger the event:
        myEvent.Trigger();

        // Unsuscribe from the the event by removing the handler from the event:
        myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
        System.Console.WriteLine("\"Hello again!\" unsubscribed from the event."); 

        // Trigger the new event:
        myEvent.Trigger();
    }
}

出力

Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!

参照

概念

C# プログラミング ガイド

参照

event (C# リファレンス)

delegate (C# リファレンス)

その他の技術情報

Java 経験者が C# で開発する場合