0

私は次のクラスを持っています

子クラス:

public class ChildClass
{
   ...
   private void EventHandler(...);
   ...
}

親クラス:

public class ParentClass
{
   ...
   ChildClass child;
   ...
   private void EventHandler(...);
   ...
}

どちらも同じイベントにイベントハンドラーがあります。

問題は、それらのハンドラーがどの順序で呼び出されるかということです。

4

6 に答える 6

6

重要な注意点

Servyは、問題のイベントがサードパーティによって所有されており、アクセサ自体を実装している可能性を排除できないことを非常に正確に指摘しています。その場合、すべての賭けは無効になります。

以下の元の回答は、私たちが沼地の標準的な、まったく面白くないイベントの実装について話していることを黙って想定しています。

元の回答

イベントはデリゲートを介して実装されます。

MSDNから:

デリゲートオブジェクトの便利なプロパティは、+演算子を使用して、1つのデリゲートインスタンスに複数のオブジェクトを割り当てることができることです。マルチキャストデリゲートには、割り当てられたデリゲートのリストが含まれています。マルチキャストデリゲートが呼び出されると、リスト内のデリゲートが順番に呼び出されます。

したがって、ハンドラーは、イベントに追加した順序で呼び出されます。

于 2013-03-20T13:09:26.803 に答える
3

MSDNのドキュメントには、マルチキャストデリゲートがサブスクライブした順序でデリゲートを呼び出すことが明記されていますが、これは、サブスクリプションの順序が決定論的である、つまりシングルスレッド環境にあることを前提としています。

そうでない場合は、BeforeEventOccursイベントとAfterEventOccursイベントの2つのイベントを定義する方がよい場合があります。これにより、マルチスレッド環境でも順序を決定的に制御できます。

于 2013-03-20T13:14:37.590 に答える
3

登録されている順序でintと呼ばれます。

于 2013-03-20T13:10:53.037 に答える
3

デリゲートがサブスクライブされる順序は、仕様のどこにも適切に記載されていないため(私が知っている)、具体的には、このような順序に依存することは、実装ごとに変わる可能性があるため、愚かである可能性があります。

于 2013-03-20T13:09:07.863 に答える
2

この質問によると、イベントハンドラーは、イベントをサブスクライブしている順序で呼び出されます。

于 2013-03-20T13:09:53.193 に答える
1

代表者から

デリゲートは、メソッドを引数として他のメソッドに渡すために使用されます。イベントハンドラーは、デリゲートを介して呼び出されるメソッドにすぎません。カスタムメソッドを作成すると、Windowsコントロールなどのクラスが、特定のイベントが発生したときにメソッドを呼び出すことができます。

方法から:デリゲートの結合(マルチキャストデリゲート)ページ;

デリゲートオブジェクトの便利なプロパティは、+演算子を使用して、1つのデリゲートインスタンスに複数のオブジェクトを割り当てることができることです。マルチキャストデリゲートには、割り当てられたデリゲートのリストが含まれています。マルチキャストデリゲートが呼び出されると、リスト内のデリゲートが順番に呼び出されます。

于 2013-03-20T13:10:10.247 に答える