2009-08-23 5 views
1

パブリッシャーとサブスクライバのパターンとして、異なるオブジェクト間の「通信」に使用します。代表者とイベント

は、私は時々イベントがstaticとして宣言されていることがわかり、いくつかの例ですと、時にはそうではありません。

public delegate void LogProgress(string str) 
public static event LogProgress LogProgressEvent; 


if (LogProgressEvent != null) 
       LogProgressEvent(tempString); 

なぜ、いつ、私は、静的を使用する必要がありますか?

答えて

8

静的イベントは実際には非常に危険で、(幸いにも)非常にまれです。静的なものと同様に、特定のインスタンスではなく一般的にタイプに適用するときに使用します。それでも、静的なイベントではなくシングルトンのインスタンスで見ることができます。

危険なのは、退会を忘れてしまい、最終的にオブジェクトの生きたままの大量のを永遠に生き残ることです。ほとんどのインスタンスベースのイベントとは対照的です。通常、インスタンスは最終的に範囲外になり、デリゲートを収集可能にします(デリゲートインスタンスはターゲットインスタンスを生き残ります)。

+0

に静的なイベントを使用しての意味を参照してください有用であろうと思いますか? しかし、そうした場合、イベントを呼び出すクラスのインスタンスを作成する必要があります。 DataClass data = new DataClass(); data.LogProgressEvent + =新しいdata.LogProgress(UpdateTextBox); – markiz

+0

ちょっと注意してください。いくつかの重要な場所(インフラストラクチャなど)からしか購読していない場合は、OKにしてください。データエンティティ( 'Person'、' Order'など) –

+0

からの購読は避けてください。しかし、まだ "デ​​ータエンティティ"オブジェクトで使用している場合は、このデータエンティティオブジェクトがなくなった後にガベージコレクタを消去しないでください。 – markiz

0

イベントに適用されるスタティックは、他のC#フィールドにスタティックを適用することと異なりません。

静的イベントは、クラスのインスタンスが存在しない場合でも、いつでも呼び出し元が利用できます。あなたは、静的メソッドからイベントを上げたい場合、私は、静的なイベントが

は、だから私は常に正しい、NONE静的なイベントを作成する必要がありますMarc's answer

+0

私はおそらく、私の答えで与えられた理由のために、コールバック代理人としてパラメータになる傾向があります。 –

+0

@Marc私はあなたに同意します –

関連する問題