2013-08-23 94 views
1

不知道如何去處置這個類,因爲我需要釋放資源,因爲應用程序中的內存泄漏導致它減慢。我不知道如何去處理下面的類,因爲一些屬性沒有實現IDisposable。我對c#相當陌生,所以不要過於複雜的迴應。如何處理一個類沒有實現IDisposable的屬性?

public class CellItem: IDisposable 
    { 
     private Timer foo = new Timer(); 

     public int MedicationDispenseId { get; set; } 
     public Enumerations.Timeslot Timeslot { get; set; } 
     public DateTime DateAdministered { get; set; } 

     protected override void Dispose(bool disposing) 
     { 
      disposing = true; 
      Dispose(disposing); 
     } 

    } 
+0

你是如何使用CellItem類的?如果你只有一個實例,你可以用關鍵字 –

+0

來包裝它,我使用它來創建列數據,並在其他類中調用它,它使用來自數據庫的數據。我有不止一個實例。什麼關鍵字? – user2708073

+0

關鍵字是「使用」 – Paparazzi

回答

7

有在該代碼中的錯誤:

protected override void Dispose(bool disposing) 
{ 
      disposing = true; 
      Dispose(disposing); 
} 

是遞歸的,如果在堆棧空間耗盡之前坐在那裏一會兒。

要回答您的問題:如果是您的代碼,那麼只需更改Dispose方法以釋放適當的資源。如果不是,那麼你就不得不問誰寫了它來修復它,或者考慮編寫你自己的(無bug)版本。

3
protected override void Dispose(bool disposing) 

您沒有實現IDisposable.Dispose()方法,所以此代碼不會編譯。受保護的Dispose(bool)方法是一次性模式的人工產物。只有當你的類有一個終結器或者當你的類從一個實現了一次性模式的基類派生出來時纔會使用它。情況也不是這樣。

所以保持簡單,只需要實現Dispose()方法:

public void Dispose() 
    { 
     foo.Dispose(); 
    } 
0

Disposing標誌不是它說的處置是否已經開始爲類中的字段,而應該被視爲一個虛擬的參數當從實現接口的無參數Dispose方法中調用protected virtual方法時,應該傳遞值true。該參數最初的設計是爲了允許爲想要向DisposeFinalize(析構函數)方法添加功能的派生類提供公共的「補丁點」,但實際上它的幾乎從來沒有適合於派生類或非密封類實現Finalize代碼,除非該類直接來自Object或來自其整個目的圍繞這種清理的類別

注意,不像大多數接口方面,IDisposable「契約」不強加任何義務上實現它,而是存在一個標準是指通過許多類型的類可以徵收一定的轉讓合同義務的類代碼要求他們的建設。一個典型的IDisposable對象會要求某個其他實體代表它做某件事,直到另行通知爲止,它將向其他實體保證在其服務不再需要時會被通知,並且將使用其方法Dispose來提供此類通知。執行IDisposable的許多類的構造函數合約將要求調用者確保在放棄該對象之前將該對象或者將其提供給承諾這麼做的其他實體。

相關問題