1

イベントを宣言するとき、イベント ハンドラーにパラメーターがある場合は、Actionデリゲートまたはデリゲートを使用してきました。Action<T, ...>最近、デリゲートの存在に気付きました。EventHandlerこれには、継承する型パラメーターが必要EventArgsです。後者の方法では、イベントで渡されるパラメーターをカプセル化するためだけに存在する追加のクラスを作成する必要があります。

では、イベントを宣言するときにデリゲートを使用する理由はですか? EventArgsそれは私に何を買うのですか?

4

4 に答える 4

3

イベント引数を返す機能を購入します。それだけです。EventHandlerその必要がない場合は、デリゲートは必要ないかもしれません。

より大きな観点からEventArgsは、イベントを使用してある場所から別の場所にデータを取得する「社会的に受け入れられる」方法です。もちろん、これを行うためにカスタム デリゲートを作成できますがEventArgs、Visual Studio などでツールがサポートされています。

于 2012-06-06T20:33:35.023 に答える
2

これにより、将来イベントを変更するための拡張ポイントが提供されます。

クラスを定義するとしましょうCar

public class Car { 
    String Make { get; set; }
    String Model { get; set; }
    int Year { get; set; }
}

そしてイベントCarBuilt

public event Action<Car> CarBuilt;

それはいいです。しかし、後でイベントに車を作った人を含めたい場合はどうすればよいでしょうか? アクションを使用して、イベント シグネチャを変更するか、その情報をCarクラスに追加する必要があります (実際には属していません)。

代わりにこのように定義すると:

public class CarBuiltEventArgs : EventArgs {
    public Car TheCar { get; set; }
}

public event EventHandler<CarBuiltEventArgs> CarBuilt;

次に、BuiltBy プロパティを CarBuiltEventArgs クラスに追加すると、準備は完了です。

public class CarBuiltEventArgs : EventArgs {
    public Car TheCar { get; set; }
    public String BuiltBy { get; set; }
}
于 2012-06-06T20:34:54.710 に答える
1

使用する最大の理由EventHandler<T>は、おそらく、異なるタイプのデリゲート(それらのタイプが同じメソッドシグネチャを使用している場合でも)は互換性がないことです。1つのイベントがを使用しEventHandler<fnordEventArgs>、別のイベントがを使用する場合Action<Object, fnordEventArgs>、同じメソッドを両方のイベントにサブスクライブできますが、一方のイベント用に作成されたデリゲートをもう一方のイベントで使用することはできません。通常、これは大したことではありません。のようなステートメントは、FirstEvent += methodNameに変換されFirstEvent += new EventHandler<fnordEventArgs>(methodName)、にSecondEvent += methodName変換されるためFirstEvent += new Action<Object, fnordEventArgs>(methodName)です。ただし、場合によっては、イベントサブスクライバーが、サブスクライブに使用したデリゲートを保存する必要があります。サブスクライバーがデリゲートを格納するには、そのタイプを正しく知っている必要があります。EventHandler<T>フォームのイベント処理メソッドのデリゲートとして一貫して使用するvoid EventHandler(Object sender, T args)適切なデリゲートタイプを簡単に作成できるようにする必要があります。

于 2012-06-06T21:40:32.997 に答える
1

引数が必要な場合は Action を使用することを示しました。この 2 つを比較して、来年要件が変更され、そのイベントで渡される新しいパラメーターが必要になった場合に何が必要になるかを自問してください。多くのコードを変更しますか、それとも EventArgs を継承する 1 つのクラスだけを変更しますか?

于 2012-06-06T20:35:07.347 に答える