C# のイベントとイベント ハンドラーを理解する 質問する

C# のイベントとイベント ハンドラーを理解する 質問する

私は、特にユーザー インターフェイスを作成するという文脈において、イベントの目的を理解しています。これは、イベントを作成するためのプロトタイプだと思います。

public void EventName(object sender, EventArgs e);

イベント ハンドラーは何をするのですか? なぜ必要なのですか? また、イベント ハンドラーはどのように作成するのですか?

ベストアンサー1

イベントハンドラを理解するには、次のことを理解する必要があります。代表者。 でC#デリゲートは、メソッドへのポインター (または参照) と考えることができます。ポインターは値として渡すことができるので便利です。

デリゲートの中心となる概念は、そのシグネチャ、つまり形状です。つまり、(1) 戻り値の型と (2) 入力引数です。たとえば、デリゲートを作成する場合、それは、を返し、およびを受け取るメソッドvoid MyDelegate(object sender, EventArgs e)のみを指すことができます。四角い穴と四角い釘のようなものです。したがって、これらのメソッドはデリゲートと同じシグネチャ、つまり形状を持つと言えます。voidobjectEventArgs

メソッドへの参照を作成する方法がわかったので、イベントの目的について考えてみましょう。システムの他の場所で何かが発生したときに、何らかのコードが実行されるようにしたい、つまり「イベントを処理したい」とします。これを行うには、実行したいコード用の特定のメソッドを作成します。イベントと実行されるメソッドを結びつけるのがデリゲートです。イベントは、イベントが発生したときに呼び出すメソッドへのポインターの「リスト」を内部に格納する必要があります。* もちろん、メソッドを呼び出すには、そのメソッドに渡す引数を知っておく必要があります。デリゲートは、イベントと呼び出されるすべての特定のメソッド間の「契約」として使用します。

したがって、デフォルトEventHandler(およびそれに似た多くのもの) は、特定の形状のメソッド(ここでも、void/object-EventArgs) を表します。イベントを宣言するときは、デリゲートを指定して、そのイベントが呼び出すメソッド (EventHandler)の形状を指定します。

//This delegate can be used to point to methods
//which return void and take a string.
public delegate void MyEventHandler(string foo);

//This event can cause any method which conforms
//to MyEventHandler to be called.
public event MyEventHandler SomethingHappened;

//Here is some code I want to be executed
//when SomethingHappened fires.
void HandleSomethingHappened(string foo)
{
    //Do some stuff
}

//I am creating a delegate (pointer) to HandleSomethingHappened
//and adding it to SomethingHappened's list of "Event Handlers".
myObj.SomethingHappened += new MyEventHandler(HandleSomethingHappened);

//To raise the event within a method.
SomethingHappened("bar");

(* これは .NET のイベントの鍵であり、「魔法」を解き明かします。イベントは実際には、裏では、同じ「形状」のメソッドのリストにすぎません。リストは、イベントが存在する場所に格納されます。イベントが「発生する」と、実際には「このメソッドのリストを調べて、これらの値をパラメーターとして使用して各メソッドを呼び出す」だけです。イベント ハンドラーを割り当てることは、呼び出されるメソッドのリストにメソッドを追加する、より美しく簡単な方法です)。

おすすめ記事