2015-09-11 117 views
0

我知道.NET中有一個'EventHandlerManager'。我讀過有關內存泄漏,如果你不釋放對象之前退訂的事件......避免事件內存泄漏

我有以下代碼:

public Person CurrentPerson 
    { 
     get { return currentPerson; } 
     set 
     { 
      if (currentPerson!= null) currentPerson.PropertyChanged -= propertyChanged; 
      currentPerson= value; 
      currentPerson.PropertyChanged += propertyChanged; 
      RaisePropertyChanged(() => CurrentPerson); 
     } 
    } 

此屬性是像一個臨時佔位符,每當我打電話:

CurrentPerson = new Person(); 

我想聽它的propertyChange事件......我不確定是否在事件處理時防止內存泄漏。

感謝您的幫助

+0

如何處置具有CurrentPerson屬性的對象。當包含屬性的對象被歸檔時,您需要取消訂閱PropertyChanged事件。 –

+0

這段代碼非常荒謬,對於一個班級來說,聽它自己的事件從來沒有任何意義。你可以直接調用this.propertyChanged()來代替。但至少有一個優點,它不可能導致任何泄漏。 –

+0

Hans Passant,這段代碼來自我的viewmodel ... CurrentPerson並沒有在'Person'類中實現。 – GrayFox

回答

1

這不會導致任何內存泄漏。由於您在刪除對象引用之前取消了對該事件的註釋,並且在它進入時連接到新的對象,這是正確的,並且不會導致內存泄漏。正如伊萬所提到的,您需要確保事件在處理對象時取消訂閱,您可以使用多種方法控制對象的銷燬。或者通過創建一個〜(classname)方法來創建一個析構函數,或者如果還有其他外部事物需要清理,則實現IDisposable。當你完成對象時調用Dispose,並且你應該確信清理和處理對象已經完成,然後你可以去引用對象。

一個方面,如果這是你的代碼實際佈局的結構,你會得到一個異常,如果某人賦予你的CurrentPerson屬性爲null,如果Person可爲空。