如何处理具有不实现IDisposable的属性的类?

时间:2013-08-23 12:59:58

标签: c# .net .net-4.0 memory-leaks garbage-collection

不确定如何处理此类,因为我需要释放资源,因为应用程序中的内存泄漏会导致速度变慢。我不知道如何处理下面的类,因为一些属性没有实现IDisposable。我是c#的新手,所以尽量不要过度复杂化。

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);
        }

    }

4 个答案:

答案 0 :(得分:7)

代码中有一个错误:

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

是递归的,如果只是在没有堆栈空间之前就坐在那里一会儿。

回答你的问题:如果是你的代码,那么只需更改Dispose方法即可释放相应的资源。如果不是那么你将不得不问谁写它来修复它或考虑编写你自己的(无bug)版本。

答案 1 :(得分:3)

    protected override void Dispose(bool disposing)

您没有实现IDisposable.Dispose()方法,因此此代码无法编译。受保护的Dispose(bool)方法是一次性图案的人工制品。它仅在您的类具有终结器或您的类派生自实现一次性模式的基类时使用。情况也不是这样。

所以保持简单,只需实现Dispose():

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

答案 2 :(得分:0)

答案 3 :(得分:0)

Disposing标志不是一个字段,表示是否已为该类开始处置,而应该被视为一个虚拟参数,true应该在{{{}}时传递从实现接口的无参数protected virtual方法调用方法。该参数最初的设计是为了允许为希望为DisposeDispose(析构函数)方法添加功能的派生类提供一个通用的“补丁点”,但在实践中它几乎从不 适用于派生或未密封的类来实现Finalize代码,除非该类是直接从Finalize派生的,或者是从整个目的围绕此类清理的类派生的。

请注意,与大多数接口不同,Object“契约”并未对实现它的类强加任何,而是作为标准手段存在,通过它可以通过多种类型的课程可以对要求构建的代码施加某些可转让的合同义务。典型的IDisposable对象将要求其他实体代表其执行某事,直到另行通知为止,将承诺其他实体在不再需要其服务时将被通知,并将使用其IDisposable发出此类通知的方法。实现Dispose的许多类的构造函数契约将要求调用者在放弃对象之前确保它IDisposable或者将其提供给其他承诺这样做的实体。