如何释放具有未实现 IDisposable 的属性的类

本文关键字:实现 IDisposable 属性 何释放 释放 | 更新日期: 2023-09-27 18:28:50

不确定如何处置这个类,因为我需要释放资源,因为应用程序中的内存泄漏导致它变慢。我不确定如何处置下面的类,因为某些属性没有实现 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);
        }
    }

如何释放具有未实现 IDisposable 的属性的类

代码中有一个错误:

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

是递归的,如果只是在堆栈空间不足之前坐在那里片刻。

要回答你的问题:如果这是你的代码,那么只需更改Dispose方法即可释放适当的资源。如果不是,那么您必须询问编写它的人来修复它或考虑编写自己的(无错误(版本。

    protected override void Dispose(bool disposing)

您没有实现 IDisposable.Dispose(( 方法,因此此代码无法编译。 受保护的 Dispose(bool( 方法是一次性模式的伪影。 仅当类具有终结器或类派生自实现一次性模式的基类时,才使用它。 事实并非如此。

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

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

尝试阅读以下资源以帮助您入门:

可识别

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

使用关键字

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

Disposing 标志不是指示类的处置是否已开始的字段,而是应被视为一个虚拟参数,当从实现接口的无参数Dispose方法调用protected virtual方法时,值true传递到该参数。 该参数最初设计为允许派生类使用通用的"补丁点",这些派生类希望向DisposeFinalize(析构函数(方法添加功能,但实际上,派生类或未密封类几乎从不适合实现Finalize代码,除非该类直接派生自Object或来自其全部目的都以此类清理为中心的类。

请注意,与大多数接口不同,IDisposable"契约"不会对实现它的类施加任何义务,而是作为一种标准手段存在,通过这种方式,许多类型的类可以对请求其构造的代码施加某些可转移的契约义务。 典型的IDisposable对象将要求其他实体代表其执行某些操作,直到另行通知,将承诺当不再需要其服务时将通知其他实体,并将使用其Dispose方法来发出此类通知。 许多实现IDisposable的类的构造函数协定将要求调用者确保在放弃对象之前,它要么Dispose它,要么将其提供给承诺这样做的其他实体。