如果我的对象从未被构造,为什么要调用Dispose?

Alp*_*pha 2 c# dispose

基于这篇文章,我在Windows窗体和IDisposable对象的组件之间创建了一个桥梁.它几乎看起来像这样:

namespace MyApp
{
    public class Disposer: Component
    {
        private readonly Action<bool> _dispose;

        public Disposer(Action<bool> disposeCallback)
        {
            if (disposeCallback == null)
                throw new ArgumentNullException(nameof(disposeCallback));

            this._dispose = disposeCallback;
        }

        protected override void Dispose(bool disposing)
        {
            this._dispose(disposing);
            base.Dispose(disposing);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.然后我创建了单元测试,包括一个用于构造函数参数的特定验证.

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Disposer_ShouldNotAllowNullActions()
{
    new Disposer(null);
}
Run Code Online (Sandbox Code Playgroud)

这是一个问题:不仅我的测试失败了,而且它实际上已经中止了.测试平台本身崩溃(ReSharper测试运行器).通过挖掘我的Windows事件查看器,我可以看到正在调用Dispose()方法,并且由于此时this._dispose基本上为null,因此失败了NullReferenceException.

我通过提供一个空的lambda作为默认值来解决这个问题.

但是如果构造函数抛出异常(我确认它会这样做),为什么要Dispose调用该方法呢?

C.E*_*uis 6

Component类必须有一个终结调用this.Dispose(),这会导致称为你覆盖.

即使构造函数没有完成,也会运行终结器 - 这允许在构造函数之前分配的所有资源都无法清除.