You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中未实现IDisposable的类,其Disposable成员会被释放吗?

未实现IDisposable的类中Disposable成员的内存释放问题

首先明确两个核心结论:

  • 托管内存层面:当ExecuteWork方法执行完毕后,pc实例会离开作用域,成为垃圾回收器(GC)的回收目标。GC会在合适时机回收pc及其包含的List成员占用的托管内存,这些对象不会一直驻留在内存中。
  • Dispose方法调用层面:List<string>.Enumerator实现了IDisposable接口,它可能持有非托管资源(比如迭代器内部状态相关资源)。但因为MyParentClass没有实现IDisposable,所以不会自动触发List成员的Dispose方法。这会导致非托管资源无法及时释放,要等到GC执行该Enumerator的终结器时才会清理,延迟了资源释放,极端情况下可能引发资源泄漏。

正确的处理方式

要解决这个问题,必须让MyParentClass实现IDisposable接口,在Dispose逻辑中显式调用成员的Dispose方法,遵循标准的Dispose模式:

public class MyParentClass : IDisposable
{
    public List<string>.Enumerator List = new List<string>.Enumerator();
    private bool _disposed = false;

    // 公开的Dispose方法
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // 受保护的Dispose逻辑,区分托管/非托管资源释放
    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;
        
        if (disposing)
        {
            // 释放托管资源:调用Disposable成员的Dispose方法
            List.Dispose();
        }

        // 此处添加非托管资源的释放逻辑(如果类中有相关资源)
        
        _disposed = true;
    }

    // 终结器,用于最后清理非托管资源
    ~MyParentClass()
    {
        Dispose(false);
    }
}

使用时,通过using语句确保Dispose方法被自动调用:

public void ExecuteWork()
{
    using (var pc = new MyParentClass())
    {
        Console.WriteLine("All done!");
    }
}

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:32:42