2

だから私は最近FxCopをいじり始めましたが、私が気づいたことの1つは、イベントに添付されたメソッドは次の形式でなければならないと主張していることです

void Callback(object sender, EventArgs args) { ...}

と添付する

MyObject.Event += new EventHandler(Callback);

.Net 1.1 の時代にはこれで十分でしたが、3.5 以降では、タイプ Action またはそのジェネリックの 1 つのイベント呼び出しを作成し、メソッドを私とまったく同じように記述する方がはるかに簡単で直感的であることに気付きました。明示的に呼び出された場合。そのオブジェクトの送信者または EventHandler のクラフトはありません。

要点として、それはフラットアウトデザインの必須事項だと思います。イベント コールバック用に別の方法でメソッドを設計する場合、それはメソッドが呼び出しに関する情報を少なくとも暗黙的に持っていることを意味します。

私は何かが欠けているかもしれないことを喜んで受け入れます。これについてどう思いますか、FxCopは間違っていますか、それとも私ですか?

4

2 に答える 2

1

規則に従う必要があります。

  1. 汎用のEventHandler<T>を使用します。ここで、TはEventArgsであるか、EventArgsから派生します。イベントをフックアップ

    MyObject.SomeEvent + = new EventHandler <EventArgs>(SomeMethod);

  2. イベントハンドラーメソッドはvoidを返す必要があり(イベントレイザーに何かを返すことは意味がありません)、イベント引数のデータを使用して送信者オブジェクトを取得する規則に従う必要があります。

「がらくた」の理由(送信者とeventargs)

  • 大会
  • 拡張性はより簡単に達成されます(イベントを発生させるクラスとそれを処理するクラスの両方)
  • 誰がイベントを送信したかを知りたい場合があります。
  • 任意/すべてのデータをイベント引数にカプセル化できます。
  • 多くのイベントに同じイベントハンドラーを使用できます。

パターンはさらに続きます。また、OnSomeEvent()という名前の保護されたメソッドでイベント「SomeEvent」を発生させて、クラスの派生元がイベントの抑制、スレッドセーフな方法での発生、UIスレッドでの発生、タイムアウトでの発生などを実行できるようにする必要があります。または例外保護、ログイベント発生プロセスなど。

ねえ、それは完全なパターンではありません(おそらく、送信者はイベント引数に入れられた可能性があります)が、ほぼすべての.Netコードがそれに続き、フレームワークコードは常にそれに続きます。同様にフォローしてみませんか。

于 2008-12-13T18:56:48.817 に答える
0

FxCop がかなり長い間更新されていないと思います。VS2008 コード分析ツール (FxCop の後継) で試してみましたか?

于 2008-12-13T17:43:32.193 に答える