我在使用 C# 的“Dispose”模式时遇到了困难。我在这里有 3 个类:一个管理类、一个表单和一个数据存储类。
管理类可以(如果需要)使用表单来提示用户输入。表单从文件中加载数据,然后用户可以对其进行修改。关闭时,表单必须保存此数据。数据存储类实现了 .Dispose(),它就是这样做的 - 将更改写入磁盘。
由于此数据存储类 (StoredInfo) 是表单 (MyForm) 的成员,因此 MyForm 还必须实现 .Dispose() 以便调用 StoredInfo.Dispose。这就是给我带来问题的原因。我的管理类,在它的代码中:
Form.Dispose();
Form = null;
我的表格:
// As written by MSVS. The exception is OK - I just want this to get called.
#region IDisposable Members
public void IDisposable.Dispose()
{
throw new NotImplementedException();
}
#endregion
...但从未调用过 Form.Dispose() 方法。使用调试器,执行如下:
Connector.Dispose() // The management class
Form.Dispose()
Form.Dispose(bool disposing) // (1) Some method designer wrote?
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
Connector.Dispose() // Back to the management class!
Form = null;
我们不知何故从未调用过 .Dispose,而是调用了 .Dispose(bool)。在 C++ 中,参数可以有默认值,我可以看到这一点,但在 C# 中,我迷路了。我最好的猜测是我的调试器没有向我展示实际发生的事情。
现在,查看类层次结构,我看到其他实现 IDisposable 的类 - 所以某处必须有另一个 Dispose() 成员。它不是虚拟的,所以我不确定为什么我没有收到编译器错误。我尝试覆盖 .Dispose(bool) 方法,因为它被调用,并且是虚拟的,但是这样:
protected override void Dispose(bool disposing)
{
StoredHosts.Dispose();
}
我得到“类型'ConnectorForm'已经定义了一个具有相同参数类型的名为'Dispose'的成员”,是的,我想它确实......在Designer's code中。所以这不是一个选择。所以回到调用 Dispose()。但是怎么做?目前,我正在怀念 C++ 析构函数的纯粹简单、强大和确定性。