2009-08-23 56 views
1

我將它們用作不同對象之間的「通信」,作爲發佈者和訂閱者模式。代表和事件

是一些例子我看到,有時候事件被聲明爲靜態的,有時不是:

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


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

爲什麼,當我需要使用靜態的?

回答

8

靜態事件實際上相當危險,並且(幸運的是)也很罕見。和任何靜態的東西一樣,當它適用於類型時,你會使用它,而不是任何特定的實例。即使如此,你可能會在單例實例中看到它,而不是靜態事件。

危險在於它很容易忘記取消訂閱,並最終保持羣衆的對象永遠存在;與大多數基於實例的事件形成對比 - 通常情況下,實例最終會超出範圍,從而使委託可收集(委託實例將使目標實例保持活動狀態)。

+0

所以我總是應該在創建無靜態事件,正確的含義是什麼? 但如果我這樣做,這將需要我創建一個類的實例,調用事件如下: DataClass data = new DataClass(); data.LogProgressEvent + = new data.LogProgress(UpdateTextBox); – markiz 2009-08-23 13:56:49

+0

只要小心。如果你只從幾個關鍵的地方(基礎設施等)訂閱它,你應該沒問題;但是避免訂閱你的數據實體('Person','Order'等) – 2009-08-23 18:08:48

+0

但是如果我仍然在「數據實體」對象中使用,那麼在這個數據實體對象消失之後,垃圾回收器不會清理垃圾嗎? – markiz 2009-08-23 21:34:39

0

靜態應用於事件與將靜態應用於任何其他C#字段沒有區別。

靜態事件可供調用者隨時使用,即使沒有該類的實例存在。我想,如果你想從一個靜態方法引發事件,靜態事件將是有益的

請參閱使用靜態事件Marc's answer

+0

我可能傾向於回調代表作爲參數,爲我在答案中給出的原因... – 2009-08-23 13:47:04

+0

@Marc我同意你 – 2009-08-23 13:55:21