69

典型的なイベントを起動するときに、複数の機会と複数の場所で次のことを読んだことを思い出します。

protected virtual OnSomethingHappened()
{
    this.SomethingHappened(this, EventArgs.Empty);
}

e は、null ではなく、興味深いイベント引数がない場合、EventArgs.Empty にする必要があります。

私は自分のコードのガイダンスに従いましたが、なぜそれが好ましい手法なのかはっきりしないことに気付きました。上記のコントラクトが null よりも EventArgs.Empty を好むのはなぜですか?

4

6 に答える 6

35

NOT NULL の背後にある理由は、パラメーターとして渡された場合、メソッドが null 参照例外を潜在的に処理する必要があるとは予想されないためだと思います。

null を渡し、メソッドが e で何かを行おうとすると、null 参照例外が発生しますが、EventArgs.Empty では発生しません。

于 2008-10-09T19:07:58.757 に答える
27

EventArgs.EmptyNull オブジェクト パターンのインスタンスです。

基本的に、「値なし」を表すオブジェクトを使用して、使用時に null をチェックしないようにします。

于 2009-06-03T22:45:43.800 に答える
8

EventArgs.Empty引数が必要ない場合でも、イベントで引数を渡すという規則を維持するために使用されると思います。

Mitchel Sellers は、投稿の途中で私の理由の残りの半分を投稿しました。これにより、メソッドがその引数を使用して何かを実行しようとした場合に null 参照例外が発生するのを防ぐことができます (それが null であるかどうかをチェックする以外に)。

EventArgs.Empty 基本的に、追加情報なしでグローバルに定義されたイベント引数の作業を行います。

規則を維持する同様の例を挙げると、私たちのチームはstring.Empty文字列を初期化するために使用します。そうしないと、さまざまなコーダーが を使用する可能性がありnewString = ""; or newString = " "; or newString = null;、そのすべてが異なるチェック条件に対して異なる結果を生成する可能性があるためです。

EventArgs.Emptyvsを使用する (少し衒学的な) 理由new EventArgs()は、前者が new を初期化せずEventArgs、メモリをわずかに節約できることです。

于 2008-10-09T19:12:14.130 に答える
2

EventHandler任意のイベント ハンドラーから呼び出され、object senderとの両方が渡されるシグネチャを持つ汎用メソッドを使用している場合、null ポインター例外を気にせずに、たとえばイベントをログに記録するためにEventArgs eを呼び出すことができます。e.ToString()

于 2008-10-09T19:10:27.067 に答える
0

「EventArgs.Empty」の代わりに「new EventArgs()」を長い間使用していました...重要なのは、Null 例外を発生させないものを渡すことだと思います。

于 2008-10-09T19:20:38.153 に答える