2009-02-20 96 views
3

說我有一個對象具有子StatusType對象的客戶端。兩者都實現INotifyPropertyChanged。取消訂閱子對象prop更改事件

客戶簽約的道具在屬性檢查空,並確保值後改變事件是不同

public StatusType Status 
{ 
    get { return _status ?? (_status = this.GetNewStatusType()); } 
    set 
    { 
     if (!(_status ?? (_status = this.GetNewStatusType())).Equals(value)) 
     { 
      _status.PropertyChanged -= Status_PropertyChanged; 
      _status = value; 
      _status.PropertyChanged += Status_PropertyChanged; 
      base.OnPropertyChanged("Status"); 
     } 
    } 
} 

客戶端偵聽屬性更改事件和氣泡起來。

void Status_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    base.OnPropertyChanged("Status." + e.PropertyName); 
} 

客戶端和StatusType從EntitiesBase,這確實執行INotifyPropertyChanged的實際繁重繼承。

所以我真正的問題是我需要從內存的原因客戶退訂StatusType.PropertyChanged事件?如果是這樣,我應該使用解構器,還是讓客戶端實現IDisposable?

如果我要使用解構器,它會看起來像這樣嗎?

~Client() 
{ 
    if (_status != null) 
    { 
     _status.PropertyChanged -= Status_PropertyChanged; 
     _status = null; 
    } 
} 

在此先感謝。在我們的應用程序中,有些時候我們可能在內存中擁有超過1000個客戶端,我想確保我的效率。

回答

1

如果這些客戶端無限期地保留在內存中並且它們的AppDomain從不卸載,那麼您可能會創建內存泄漏。 IDisposable可能是一條更好的路線,因爲您將有確定性的方法來清理不再需要的處理程序。

[編輯]請記住,即使您可以從事件的調用列表中刪除委託,您將不會釋放內存,直到GC運行。您也可能會感興趣:http://msdn.microsoft.com/en-us/library/aa970850.aspx