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
相关产品推荐
相关产品推荐

