1. ホーム
  2. c#

[解決済み】C#でイベントとイベントハンドラを理解する

2022-04-18 18:16:20

質問

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

public void EventName(object sender, EventArgs e);

イベントハンドラとは何なのか、なぜ必要なのか、そしてどのように作成するのか。

どのように解決するのですか?

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

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

つまり、システムの他の場所で何かが起こったときに、何らかのコードを実行させたい、つまりイベントを処理したいのです。そのためには、実行させたいコードに対応する特定のメソッドを作成します。イベントと実行されるメソッドの間にある糊がデリゲートです。イベントは、イベントが発生したときに呼び出すべきメソッドへのポインタの "list" を内部に保持する必要があります * もちろん、メソッドを呼び出せるようにするには、そのメソッドに渡すべき引数を知る必要があります もちろん、メソッドを呼び出すためには、そのメソッドに渡す引数を知っておく必要があります! イベントと呼び出されるすべてのメソッドの間の "contract" として、デリゲートを使用します。

そのため、デフォルトの 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におけるイベントの鍵であり、quot;magic"を取り除きます - イベントは実際には、カバーの下では、同じquot;shape"のメソッドのリストだけです。このリストは、イベントが存在する場所に保存されます。イベントが発生したら、このメソッドのリストを見て、これらの値をパラメータとして各メソッドを呼び出すだけです。イベントハンドラを割り当てることは、呼び出されるメソッドのリストにあなたのメソッドを追加する、よりきれいで簡単な方法なのです。)