私は、複数の機会に、複数の場所で、典型的なイベントを発火したときに次のことを読んだことを思い出します。
protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}
nullではなく、興味深いイベント引数がない場合は、eをEventArgs.Emptyにする必要があります。
私は自分のコードのガイダンスに従いましたが、なぜそれが好ましい手法であるのかはっきりしないことに気づきました。記載されている契約がnullよりもEventArgs.Emptyを優先するのはなぜですか?
NOT NULLの背後にある理由は、パラメーターとして渡されたときに、メソッドがnull参照例外を処理する必要がない可能性があるためだと思います。
Nullを渡して、メソッドがeで何かを行おうとすると、null参照例外が発生しますが、EventArgs.Emptyでは発生しません。
EventArgs.Empty
は Nullオブジェクトパターン のインスタンスです。
基本的に、使用時にnullをチェックしないように、「値なし」を表すオブジェクトを用意します。
_EventArgs.Empty
_は、必要がない場合でも、イベントで引数を渡す規則を維持するために使用されると思います。
Mitchel Sellersは、私の投稿の途中で私の理由の残りの半分を投稿しました。メソッドがその引数で何かをしようとした場合にnull参照例外を防ぎます(nullかどうかのチェック以外)。
_EventArgs.Empty
_は基本的に、追加情報なしでグローバルに定義されたイベント引数の作業を行います。
規則を維持する同様の例を示すために、私たちのチームは_string.Empty
_を使用して文字列を初期化します。そうしないと、異なるコーダーが_newString = ""; or newString = " "; or newString = null;
_を使用する可能性があり、そのすべてが異なるチェック条件に対して異なる結果を生成する可能性があります。
_EventArgs.Empty
_とnew EventArgs()
を使用する(やや衒学的な)理由は、前者が新しいEventArgs
を初期化せず、わずかなメモリを節約するためです。
任意のイベントハンドラーから呼び出され、_object sender
_と_EventArgs e
_の両方が渡されるEventHandler
シグネチャを持つ汎用メソッドを使用している場合=、nullポインタの例外を気にすることなく、たとえばイベントのログ記録のためにe.ToString()
を呼び出すことができます。
「EventArgs.Empty」の代わりに長い間「newEventArgs()」を使用しました...重要なのは、Null例外を引き起こさないものを渡すことだと思います。
アルバハリの本から:"in order to avoid unnecessarily instantiating an instance of EventArgs."