0

DataEventArgs<TData>イベント宣言でカスタム EventArgs 継承クラスを宣言して使用するのではなく、ジェネリッククラスを使用することは、.Net イベントの「パターン」規則に違反していますか? または、状況によっては悪い習慣と見なされますか?

(イベント引数の命名規則は、イベント名を使用し、接尾辞「EventArgs」を追加することです。使用DataEventArgs<TData>すると、送信されるデータのタイプが表示されますが、イベント名は省略されます。)

TData に使用するクラスを変更できない限り、一般的な DataEventArgs クラスは、別のプロパティを追加するなどの拡張機能に対して閉鎖的であると主張することができます。


より長い説明:

いくつかのデータを含む標準デリゲート イベントを宣言するとき、標準イベント「パターン」規則は、ジェネリック EventHandler デリゲートを使用して宣言することであると理解しています。

public event EventHandler<SomethingHappendEventArgs> SomethingHappend;

特定のSomethingHappendEventArgsものが次の行に沿って宣言されている場合

public class SomethingHappendEventArgs : EventArgs
{
    public SomeDataType Value { get; private set; }
    public SomethingHappendEventArgs(SomeDataType data)
    {
        this.Value = data;
    }
}

グーグルで調べてみると、汎用の DataEventArgs クラス (Microsoft.Practices.Prism.Events を含む) を提供する Microsoft 名前空間がいくつかあることに気付きました。ただし、SomethingHappendEventArgs やその逆などのカスタマイズされたイベント データ クラスの代わりに、それをいつ使用するかについての推奨事項や規則の指示はどこにも見つかりませんでした。

では、イベント データに含めたいデータが1 つある場合、このようなイベントを宣言するのではなく、SomethingHappendEventArgs のようなカスタマイズされたイベント データ クラスを使用する必要がある理由はありますか?

public event EventHandler<DataEventArgs<SomeDataType>> SomethingHappend;

ジェネリックは次のDataEventArgsように宣言できます。

public class DataEventArgs<TData> : EventArgs
{
    public TData Value { get; private set; }
    public DataEventArgs(TData value)
    {
        this.Value = value;
    }
}
4

1 に答える 1

6

非パブリック イベントにジェネリック EventArgs サブクラスを使用しない理由はほとんどありません。ただし、完全に公開された API の一部であるイベントの場合、後方互換性の問題が発生する可能性があるため、少し複雑になります。パブリックに消費されるイベントの場合、イベント固有の EventArgs サブクラスを作成すると、API コンシューマーに影響を与えずにメンバーを追加する柔軟性が得られます。

パブリック API の一部ではないイベントの場合、特定のイベントに EventArgs サブクラスが変更された場合、ジェネリック サブクラスが適切ではなくなったため、多少のやり直しが必要になる可能性があります。ただし、これは通常は最小限に抑える必要があり、コンパイラは問題 (明示的または匿名のハンドラー メソッドが使用されているかどうか) をキャッチする必要があります。明らかに、最初の開発作業と潜在的な変更作業の間にはトレードオフがあります。fwiw、私はそれが適切な内部イベントにジェネリック EventArgs を使用しています。リリース。

于 2013-04-02T16:59:32.187 に答える