6

イベントを発生させる方法は2つあります。

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);
}

私は最後のものが好きです。短いです。
私の同僚は最初の変種を主張します。

最初のものが2番目のものよりも優れていることはありますか?

4

1 に答える 1

11

C# 6 の更新

C# 6 では、次のように null 条件演算子を使用するだけです。

PropertyChanged?.Invoke(this, args);

これはRoslyn wiki で推奨されています

元の回答

Eric Lippert がEvents and Races に関するすばらしいブログ記事を投稿しています。

イベントが null に設定される可能性があるため、最初のオプションは 2 番目のオプションよりも安全であると見なすことができます。誰かが不用意にクラスを変更する可能性があります。また、インスタンスを逆シリアル化する場合、2 番目の方法は機能しません (使用するシリアル化メカニズムによって異なります)。

ヘルパー メソッドを使用してイベントを発生させることがあります

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);
    }
}
于 2012-11-29T15:40:58.717 に答える