【问题标题】:How to dispose of a class with properties that do not implement IDisposable?如何处置具有不实现 IDisposable 的属性的类?
【发布时间】:2023-03-08 00:21:01
【问题描述】:

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

    }

【问题讨论】:

  • 您如何使用 CellItem 类?如果你只有一个实例,你可以用 using 关键字包装它
  • 我正在使用它来创建列数据,在其他类中调用它,它正在使用数据库中的数据。我有不止一个实例。究竟是什么关键字?
  • 关键字是“使用”
  • 我将如何使用关键字 using 将其包装起来?
  • 每个单元格都有计时器吗?

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


【解决方案1】:

代码中有一个错误:

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

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

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

【讨论】:

    【解决方案2】:
        protected override void Dispose(bool disposing)
    

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

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

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

    【讨论】:

      【解决方案3】:

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

      一次性的

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

      使用关键字

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

      【讨论】:

      【解决方案4】:

      Disposing 标志不是表示类是否已开始处理的字段,而是应将其视为虚拟参数,在调用 protected virtual 方法时应将值 true 传递给该参数来自实现接口的无参数Dispose 方法。该参数最初被设计为允许派生类使用公共“补丁点”,这些派生类希望向DisposeFinalize(析构函数)方法添加功能,但实际上它几乎从不适合派生类或非密封类实现 Finalize 代码除非该类直接派生自 Object 或从整个目的围绕此类清理的类派生

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

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多