gpt4 book ai didi

c# - 如果我的对象从未构造过,为什么要调用 Dispose?

转载 作者:行者123 更新时间:2023-11-30 19:56:29 27 4
gpt4 key购买 nike

基于 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 类必须有一个调用 this.Dispose() 的终结器,这会导致调用覆盖。

即使构造函数未完成,终结器也会运行 - 这允许清理在构造函数失败之前分配的所有资源。

关于c# - 如果我的对象从未构造过,为什么要调用 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743084/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com