2013-08-23 59 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的许多类的构造函数合约将要求调用者确保在放弃该对象之前将该对象或者将其提供给承诺这么做的其他实体。

相关问题