イベント (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# プログラミング ガイド)」を参照してください。
メモ : |
---|
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!