2012-11-29 4 views
6

を高め、NullObjectパターン我々は2つの方法でイベントを発生させることができます。.NETイベント

public event EventHandler MyEvent; 

private void DoSomething() 
{ 
    ... 
    var handler = MyEvent; 
    if (handler != null) 
     handler(this,EventArgs.Empty); 
} 

public event EventHandler MyEvent = (o,e) => {} ; 

private void DoSomething() 
{ 
    ... 
    MyEvent(this, EventArgs.Empty); 
} 

私は最後のものを好みます。それはより短いです。
私の同僚は最初の変種を主張しています。

第1のものと第2のものとの優越性はありますか?

+0

を上げるためにヘルパーメソッドを使用します;' –

+5

@ JonB:間違った;スレッドセーフではありません。 – SLaks

+3

どのようにクラスがイベントをnullに設定しないようにしますか? –

答えて

11

あなたは、単にそのようなヌル・条件演算子を使用C#6でC#6

の更新:これは​​

オリジナル回答

ある

PropertyChanged?.Invoke(this, args); 

Eric Lippertはa great blog post on Events and Races、あなたが読まなければならない場合はそれを読んでください。

イベントがnullに設定される可能性があるため、最初のオプションは2番目のオプションよりも安全であると考えられます。誰かが不注意にクラスを修正する可能性があります。また、インスタンスを逆シリアル化する場合、2番目のメソッドは機能しません(使用するシリアル化の仕組みによって異なります)。

私は時々、あなたは、少なくとも `(もし!this.MyEvent = null)のthis.MyEvent(この、EventArgs.Empty)への最初のを簡素化することができ、イベント

static class Raiser 
{ 
    public static void Raise<T>(this EventHandler<T> evnt, object sender, T args) 
     where T : EventArgs 
    { 
     if (evnt != null) 
     { 
      evnt(sender, args); 
     } 
    } 
} 

class SomeClass 
{ 
    public event EventHandler<EventArgs> MyEvent; 

    private void DoSomething() 
    { 
     MyEvent.Raise(this, EventArgs.Empty); 
    } 
} 
+0

の両方の世界のベストとエクステンションメソッドの良い使用は、私のオレンジ色の矢印を取得します。 – Paolo

+0

ニースヘルパーメソッド。ありがとう! –

+0

私はあなたの主張に同意しますが、私は '不注意な改造'に興味があります。それは、コードのどこか別の場所で誤って変更される可能性のあるメソッドの変数をチェックする必要があるのでしょうか?私はそのような目的のためにコード契約の不変条件であると思った。 –

関連する問題