2015-07-21 22 views
2

我有下面的代碼,它有一個'PropertyChangedEventHandler'。我看到它有一個屬性PropertyChangedEventHandler,但我沒有看到任何它調用'新的PropertyChangedEventHandler'?當我不需要它時,是否需要'引用'參考?PropertyChangedEventHandler是如何在C#中創建和釋放的?

public abstract class MyClass: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler eventHandler;  
} 
+0

可能的重複[瞭解C#中的事件和事件處理程序](http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp) – poke

回答

3

當您聲明一個事件時,編譯器會自動創建一個名爲「add」和「remove」的目標委託類型和兩個包裝器方法的支持字段。當您訂閱該事件時,「add」方法在內部被調用,並且如果尚未創建,它會創建底層代理的實例(在這種情況下爲PropertyChangedEventHandler)。

當您取消訂閱該事件時,會在內部調用「remove」方法。如果沒有更多訂戶,則在「remove」方法中,底層代理字段會自動設置爲null。所以你不需要明確地設置它爲空。

這就是您在提出事件之前需要檢查空引用的原因,因爲如果沒有訂閱者,則基礎字段將爲空。

+0

我在調查爲什麼PropertyChangedEventHandler對象不會被釋放。我懷疑代碼中還有一些用戶正在被保存(不正確),導致PropertyChangedEventHandler不能被釋放。有沒有辦法檢查PropertyChangedEventHandler有多少用戶? – n179911

1

這是宣佈爲event。默認情況下,會自動創建一個事件作爲可以添加和刪除代理的多播委託。

所以不,你不需要做任何事情。該框架將初始化並酌情釋放它。