2016-04-05 17 views
4

これは私が常にイベントライザーを書いた方法です。 PropertyChanged例えば:C#のnull条件付きデリゲート呼び出しスレッドセーフですか?

public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string name) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(name)); 
    } 

最新のVisual Studioで、しかし、電球thingamabobはこれにコードを簡素化提案:

private void RaisePropertyChanged(string name) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    } 

私は簡素化の賛成で常にだが、私がしたかったですこれが安全であることを確認してください。私の元のコードでは、nullチェックと呼び出しの間に加入者が配置される可能性のある競合状態を防ぐために、ハンドラを変数に割り当てます。新しい簡素化されたフォームがこの状態に苦しむだろうと私には思われますが、誰かがこれを確認したり拒否できるかどうかを見たいと思っていました。

答えて

5

コンパイラは にコードを生成するための新しい方法は、スレッドセーフでは 一時変数に結果を維持する、唯一のPropertyChanged 1時間を評価します。 null条件付きデリゲート呼び出し構文 PropertyChanged(e)がないため、Invokeメソッド を明示的に呼び出す必要があります。それを許可するにはあまりにも多くの曖昧な解析状況 がありました。

https://msdn.microsoft.com/en-us/library/dn986595(v=vs.140).aspx

7

これは、置き換えられたコード(最初の例)と同じスレッドセーフです。なぜなら、隠された変数を使用することとまったく同じことをしているからです。 MSDNから

関連する問題