2009-07-15 1 views
5

でイベントハンドラを初期化私は、コードのこの種にいくつかの場所を見てきました:C#の:ダミー

public event SomeEventHandler SomeEvent = (s, e) => { }; 

は、物事のその方法をお勧めしますか?それは何を解決するのですか、それに何か注目すべき副作用がありますか?私はまだヌルチェックをしなければなりませんか?それとも、まさに私がもう何もする必要はないのですか?ガベージコレクションはまだ動作するはずですか?例えば


private PropertyChangedEventHandler propertyChanged; 
private readonly object propertyChangedLock = new object(); 
public event PropertyChangedEventHandler PropertyChanged 
{ 
    add 
    { 
     lock (propertyChangedLock) 
      propertyChanged += value; 
    } 
    remove 
    { 
     lock (propertyChanged) 
      propertyChanged -= value; 
    } 
} 
protected void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler; 
    lock (propertyChangedLock) 
     handler = propertyChanged; 

    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
} 

は、私がこれに最初の行を変更でした:

private PropertyChangedEventHandler propertyChanged = (s, e) => { }; 

をそしてOnPropertyChangedをメソッドにヌル・チェックをスキップ?そして、ヌルチェックをスキップすると、ロックをスキップすることができますか?もしそうなら、それは私にこれを与えるでしょう:

protected void OnPropertyChanged(string propertyName) 
{ 
    propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

初期化を考慮に入れても安全ですか?または私が逃したいくつかの副作用はありますか?

+2

件名に関する私の記事:http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx –

+0

素敵な記事!言い換えれば、ヌルチェックを削除することはスレッドセーフです。しかし、加入者は壊れないスマートハンドラを持つ必要があります。私はそれを得ましたか? – Svish

答えて

7

本当に無力チェックをする必要はありませんが、イベントスレッドセーフ、あなたはまだロックでそれを取得する必要があります。

protected void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler; 
    lock (propertyChangedLock) 
    { 
     handler = propertyChanged; 
    } 
    handler(this, new PropertyChangedEventArgs(propertyName)); 
} 

は、そうでない場合は、あなたが最新の値を取得することはできません - イベントハンドラは、別のスレッドに追加されている場合、あなたは理論的にイベントを発生させることができ新しいハンドラを呼び出すことなく永遠に。実際には私はあなたがほとんど常にロックなしで離れていくと信じていますが、メモリモデルの用語では、いくつかの種類のフェンスが必要です。

個人的には、を試して、を試してみて、イベントをスレッドセーフにすることをお勧めします。

+0

スレッドセーフなものはすべてスキップするだけですか? – Svish

+0

はい。発信者に適切なスレッドで購読する。 –

+0

どうすればいいですか? – Svish

0

NULL Object patternの実装として見ることができます。

NULL値のチェックを行う必要がないため、コードを読みやすくするのに役立ちます。

追加/削除ロジックのロックは、必要な場合は残しておく必要があります。彼らはそれとは関係がありません。彼らは競争条件を避けるために使用されています(しかし、彼らがあなたの状況で必要であるかどうかわかりません)