なぜnullではなくEventArgs.Emptyを使用するのですか?
質問
私は、典型的なイベントを発生させたときに、複数の場面で、複数の場所で読んだことを思い出します:
protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}
eは、興味深いイベント引数がない場合、nullではなくEventArgs.Emptyである必要があります。
コードのガイダンスに従いましたが、なぜそれが好ましいテクニックなのか明確ではないことに気付きました。指定された契約がnullよりEventArgs.Emptyを好むのはなぜですか?
解決
NOT NULLの背後にある理由は、パラメーターとして渡されたときに、メソッドが潜在的にnull参照例外を処理する必要がないと考えられるためだと思います。
nullを渡し、メソッドがeで何かを行おうとすると、null参照例外が発生しますが、EventArgs.Emptyでは発生しません。
他のヒント
EventArgs.Empty
は、ヌルオブジェクトパターンのインスタンスです。
基本的に、「値なし」を表すオブジェクトがあります。使用時にnullをチェックしないようにします。
EventArgs.Empty
は、イベントが必要ない場合でも、イベントで引数を渡すという規則を維持するために使用されると考えています。
Mitchel Sellersは、投稿の途中で理由の残りの半分を投稿しました:メソッドがその引数で何かをしようとすると、null参照例外が防止されます(nullかどうかを確認します)。
EventArgs.Empty
は基本的に、グローバルに定義されたイベント引数の作業を追加情報なしで行います。
規約を維持する同様の例を示すために、チームは string.Empty
を使用して文字列を初期化します。そうしないと、別のコーダーが newString ="&quot ;;またはnewString =" &quot ;;またはnewString = null;
。これらはすべて、異なるチェック条件に対して異なる結果を生成する場合があります。
EventArgs.Empty
と new EventArgs()
を使用する(やや退屈な)理由は、前者が新しい EventArgs
を初期化しないためです。 、わずかなメモリを節約します。
イベントハンドラから呼び出され、 object sender
の両方に渡される EventHandler
シグネチャを持つ汎用メソッドを使用している場合em>および EventArgs e
、nullポインター例外を心配することなく、たとえばイベントを記録するために e.ToString()
を呼び出すことができます。
長い時間" new EventArgs()"を使用しました" EventArgs.Empty"の代わりに... Null例外を引き起こさないものを渡すことが重要だと思います。
アルバハリの本から:" EventArgsのインスタンスを不必要にインスタンス化しないようにするため。"