如果我的对象从未构造过,为什么要调用 Dispose?
Why is Dispose being called, if my object was never constructed?
基于this post,我在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);
}
}
}
到目前为止一切顺利。然后我创建了单元测试,包括一个用于对构造函数参数进行特定验证的单元测试。
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Disposer_ShouldNotAllowNullActions()
{
new Disposer(null);
}
这里有一个要点:不仅我的测试失败了,而且它实际上被中止了。测试平台本身崩溃(ReSharper 测试运行器)。通过深入研究我的 Windows 事件查看器,我可以看到正在调用 Dispose() 方法,并且由于此时 this._dispose
基本上为 null,因此它失败并显示 NullReferenceException
.
我通过提供一个空的 lambda 作为默认值来解决这个问题。
但是如果构造函数抛出异常(我确认确实如此),为什么要调用 Dispose
方法?
Component
class 必须有一个调用 this.Dispose()
的终结器,这会导致调用覆盖。
终结器是 运行 即使构造函数没有完成 - 这允许在构造函数失败之前分配的所有资源被清理。
why is the Dispose
method called at all?
即使构造函数抛出异常,也会调用 class 的终结器。 finalizer for Component
调用 Dispose()
:
~Component() {
Dispose(false);
}
由于您覆盖了 Dispose(bool)
,如果构造函数抛出异常,您的覆盖将被调用。由于这在您的代码中确实存在,因此我建议确保 this
和 this._dispose
都不为空。
基于this post,我在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);
}
}
}
到目前为止一切顺利。然后我创建了单元测试,包括一个用于对构造函数参数进行特定验证的单元测试。
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Disposer_ShouldNotAllowNullActions()
{
new Disposer(null);
}
这里有一个要点:不仅我的测试失败了,而且它实际上被中止了。测试平台本身崩溃(ReSharper 测试运行器)。通过深入研究我的 Windows 事件查看器,我可以看到正在调用 Dispose() 方法,并且由于此时 this._dispose
基本上为 null,因此它失败并显示 NullReferenceException
.
我通过提供一个空的 lambda 作为默认值来解决这个问题。
但是如果构造函数抛出异常(我确认确实如此),为什么要调用 Dispose
方法?
Component
class 必须有一个调用 this.Dispose()
的终结器,这会导致调用覆盖。
终结器是 运行 即使构造函数没有完成 - 这允许在构造函数失败之前分配的所有资源被清理。
why is the
Dispose
method called at all?
即使构造函数抛出异常,也会调用 class 的终结器。 finalizer for Component
调用 Dispose()
:
~Component() {
Dispose(false);
}
由于您覆盖了 Dispose(bool)
,如果构造函数抛出异常,您的覆盖将被调用。由于这在您的代码中确实存在,因此我建议确保 this
和 this._dispose
都不为空。