【C#】EventHandlerとは

EventHandler は、C#プログラムでイベントを定義および処理するためのデリゲート型の一つです。イベントは、オブジェクト間の通知と通信に使用され、一つのオブジェクトが別のオブジェクトに何かが起こったことを通知するために使用されます。通常、GUIアプリケーションや多くのアプリケーションフレームワークで広く利用されています。

解説

EventHandlerは、コンピュータープログラムで何かが起こったときに、それに対する反応や処理をするための方法です。これは、コンピュータープログラムが何かを監視して、特定の出来事(イベント)が発生したときに何かを行うための仕組みです。

EventHandlerを理解するために、例を挙げてみましょう。あなたがゲームをプレイしていると仮定しましょう。ゲームでは、キーボードのボタンを押すことでキャラクターを動かすことができます。ここでEventHandlerが登場します。

イベントハンドラは、キーボードのボタンが押されたときに何をするかを決定します。例えば、もし「上矢印」キーが押されたら、キャラクターを上に動かすことができます。これを実現するために、以下のように考えることができます。

  1. キーボードが何かのキーを押すと、コンピューターはそのイベント(キーが押されたこと)を検出します。
  2. イベントハンドラは、このイベントに対して「上矢印」キーが押されたらキャラクターを上に動かす処理をするように指示されています。

EventHandlerは、イベントと処理の橋渡しをする役割を果たしているのです。小学生にとっても、このような例を通じて、コンピュータープログラムが特定の状況に反応して何かを行う方法を理解するのに役立つかもしれません。

イベント定義例

EventHandler デリゲートは、イベントハンドラメソッド(イベントが発生したときに実行されるメソッド)のシグネチャを表します。具体的には、以下のように定義されています:

public delegate void EventHandler(object sender, EventArgs e);

ここで:

  • object sender パラメータは、イベントを発生させたオブジェクトへの参照を受け取ります。これにより、イベントハンドラがどのオブジェクトからイベントが発生したかを識別できます。
  • EventArgs e パラメータは、イベントに関連するデータを持つオブジェクトです。先に説明したように、通常は EventArgs.Empty が使用され、特別なデータが必要ない場合にデフォルトのイベントデータとして渡されます。

イベント発生例

イベントハンドラは、このデリゲート型に従って宣言され、イベントが発生したときに呼び出されます。以下は、イベントハンドラの宣言とイベントの発生例の簡単な例です:

public event EventHandler MyEvent; // イベントの宣言

// イベントを発生させるコード
if (MyEvent != null)
{
    MyEvent(this, EventArgs.Empty); // イベントデータが不要な場合、EventArgs.Emptyを使用
}

イベントハンドラメソッドは、特定のイベントに対する応答として実装され、イベントが発生した際に呼び出されます。

.Netのソースコード

ブログの下の方で解説されています

イベント発生例の置き換えコード(リファクタリング)

このコードをリファクタリングして、C# 6.0以降の新しいイベントハンドラーの推奨される方法で書き換えることができます。新しい方法では、eventを宣言した際にC#の新しいイベントハンドラーシンタックスを使用します。また、?.Invoke演算子を使用して、nullチェックとイベントの発火を同時に行います。以下はリファクタリングされたコードです。

public event EventHandler MyEvent; // イベントの宣言

// イベントを発生させるコード
MyEvent?.Invoke(this, EventArgs.Empty); // イベントデータが不要な場合、EventArgs.Emptyを使用

この方法を使用すると、明示的なnullチェックが不要になり、コードが簡潔になります。また、C# 6.0以降のバージョンでは、この新しいイベントハンドラーシンタックスが推奨されています。