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

C#派生类IDisposable实现问题:NSubstitute代理未触发Dispose

派生类IDisposable实现未触发预期Dispose方法问题

我尝试在派生类上实现IDisposable模式,但未达到预期效果。当调用包装类的Dispose方法时,并未触发DerivedClass的Dispose方法,仅调用了BaseClass的Dispose方法。

基类代码

public class BaseClass : IDisposable
{
    // 检测重复调用
    private bool _disposedValue;

    // 供外部调用的Dispose模式实现
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // 受保护的Dispose模式实现
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposedValue)
        {
            if (disposing)
            {
                // TODO: 释放托管状态(托管对象)
            }

            // TODO: 释放非托管资源(非托管对象)并重写终结器
            // TODO: 将大字段设置为null
            _disposedValue = true;
        }
    }
}

派生类代码

public class DerivedClass : BaseClass
{
    // 检测重复调用
    private bool _disposedValue;

    // 重写受保护的Dispose模式实现
    protected override void Dispose(bool disposing)
    {
        if (!_disposedValue)
        {
            if (disposing)
            {
                
            }

            _disposedValue = true;
        }

        // 调用基类实现
        base.Dispose(disposing);
    }
}

包装类代码

public class WrapperClass : IDisposable
{
    public ReadOnlyCollection<BaseClass> Items { get; set;}

    // 检测重复调用
    private bool _disposedValue;

    // 供外部调用的Dispose模式实现
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // 受保护的Dispose模式实现
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposedValue)
        {
            if (disposing)
            {
                    foreach (var item in Items)
                    {
                        item.Dispose();
                    }
            }

            _disposedValue = true;
        }
    }
}

补充说明

后续发现关键影响因素:Items集合的创建方式会直接导致结果差异:

  • 以下方式不会调用派生类的Dispose方法:
Items = new ReadOnlyCollection<BaseClass>(new List<BaseClass>
{
    Substitute.For<DerivedClass>()
})
  • 以下方式则会正常调用派生类的Dispose方法:
Items = new ReadOnlyCollection<BaseClass>(new List<BaseClass>
{
    new DerivedClass()
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:50:30