
比較表
比較基準 | 代議員 | イベント |
---|---|---|
基本 | デリゲートはメソッドの参照を保持します。 | このイベントは、参加者に提供されるオーバーレイ抽象化です。 |
構文 | デリゲートreturn_typeデリゲート名(parameter_list); | イベントevent_delegate event_name; |
キーワード | デリゲートはキーワード「デリゲート」を使って宣言されます。 | イベントはキーワード "event"を使って宣言されます。 |
宣言 | デリゲートはクラス外で宣言されています。 | イベントはクラス内で宣言されています。 |
呼び出す | メソッドを呼び出すには、デリゲートを参照する必要があります。 | メソッドを呼び出すには、それをイベントに割り当てる必要があります。 |
共分散と逆共分散 | 彼らは参加者に柔軟性を提供します。 | そのような概念はありません。 |
イベントアクセサ | そのような概念はありません。 | イベントハンドラのリストを管理します。 |
依存 | 参加者はイベントとは無関係です。 | イベントは代理人なしでは作成できません。 |
代議員の定義
C#では、デリゲートはメソッドを参照するための関数ポインタとして使用されます。 それは、それに割り当てられているメソッドを参照するオブジェクトです。 同じデリゲートを使用して異なるメソッドを参照することができます。異なるメソッドの参照を1つずつ保持できるからです。 どのメソッドがデリゲートによって呼び出されるかは、実行時に決定されます。 デリゲートを宣言する構文は次のとおりです。
デリゲートreturn_typeデリゲート名(parameter_list);
ここで、return_typeは、メソッドによって返される値の型を宣言します。つまり、デリゲートによって呼び出され、delegate_nameはデリゲートの名前です。 parameter_listは、デリゲートによって呼び出されるメソッドに必要なパラメータのリストを定義します。
参加者について覚えておくべきいくつかの重要な点があります。 シグニチャと戻り値の型に一致する任意のメソッドを呼び出すことができます。 デリゲートはインスタンスメソッドと静的メソッドの両方を呼び出すことができます。 インスタンスメソッドを呼び出す場合は、そのメソッドを呼び出すためにobjectの助けを借りる必要があります。 デリゲートはマルチキャストをサポートしています。つまり、デリゲートを参照しているデリゲートが呼び出されたときに自動的に呼び出されるメソッドを連鎖させることができます。 「+ =」演算子を使用して、デリゲートオブジェクトを作成してメソッドをチェーンに順番に割り当てるだけです。 また、「 - =」演算子を使用してメソッドのチェーンを解除することもできます。
デリゲートに柔軟性を追加する機能は、共分散と逆分散です。 共分散と逆分散は、デリゲートに割り当てられたメソッドの戻り値の型とシグネチャがデリゲートのそれと異なるという条件を許可します。
- 共分散を使用すると、メソッドの戻り型がデリゲートの戻り型を指定するクラスから派生したクラスである場合、デリゲートにメソッドを割り当てることができます。
- Contravarianceを使用すると、メソッドのパラメータ型がデリゲートのパラメータとして指定されているクラスの基底クラスである場合に、デリゲートにメソッドを割り当てることができます。
イベントの定義
イベントは、オブジェクトの状態を変更するために実行されるアクションです。 イベントはデリゲートを使用して宣言されます。デリゲートが存在しないと、イベントを宣言できません。 あなたはイベントがデリゲートへのカプセル化を提供すると言うことができます。 イベントを扱うときには、イベントとイベントハンドラという2つの重要な要素があります。 オブジェクトがイベントに関心がある場合は、その特定のイベントのイベントハンドラを登録します。 そして、イベントが発生するたびに、登録されたイベントハンドラが呼び出されます。 イベントの宣言は以下のとおりです。
イベントevent_delegate event_name;
ここで、「イベント」は、イベントの宣言を示すキーワードである。 次に、event_delegateはイベントをサポートしているデリゲートの名前を示します。 次に、event_nameはイベントの名前です
イベントを扱う際に覚えておくべきいくつかの重要な点があります。 デリゲートと同様に、イベントはマルチキャスト、つまりイベントハンドラにチェーンされた(登録された)複数のオブジェクトでもあり、イベントが発生したときに応答します。 イベントハンドラは、演算子「+ =」を使用してチェーンに追加でき、演算子「 - =」を使用して連鎖を解除できます。静的メソッドとインスタンスメソッドの両方をイベントハンドラとして使用できます。 イベントアクセサはあなたにイベントハンドラリストの実装の制御を与えることができます。
インタフェースはイベントを含むことができます。 イベントは抽象化することもできますが、アクセサベースのイベントは抽象化することはできません。 イベントは仮想的で、派生クラスによってオーバーライドされることがあります。
C#のデリゲートとイベントの主な違い
- デリゲートは、メソッドの参照を保持するための関数ポインタとして使用されるオブジェクトです。 一方、イベントは参加者に抽象化を提供します。
- デリゲートを宣言するために必要なキーワードはデリゲートですが、イベントを宣言するために必要なキーワードはeventです。
- デリゲートはクラスの外側で宣言されますが、イベントはクラスの内側で宣言されます。
- デリゲートオブジェクトを使用してメソッドを呼び出すには、そのメソッドをデリゲートオブジェクトに参照する必要があります。 一方、イベントオブジェクトを使用してメソッドを呼び出すには、そのメソッドをイベントオブジェクトを参照する必要があります。
- 共分散と逆分散は、デリゲートオブジェクトにさらなる柔軟性を提供します。 一方、イベントにはそのような概念はありません。
- Event Accessorはイベントハンドラのリストを処理しますが、デリゲートはそのような概念を持ちません。
- デリゲートはイベントから独立していますが、イベントはデリゲートなしでは作成できません。
結論:
デリゲートはイベントをサポートし、実行時にメソッドを実行する機能を提供するので便利です。 イベントアクセサを使用すると、マルチスレッドアプリケーションでイベントハンドラを同期させることができます。