gpt4 book ai didi

C# 处理方法

转载 作者:行者123 更新时间:2023-11-30 20:14:04 24 4
gpt4 key购买 nike

我在使用 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();
}

我得到“Type 'ConnectorForm' already defines a member called 'Dispose' with the same parameter types”,是的,我想它确实...在 Designer 的代码中。所以这不是一个选择。所以回到调用 Dispose()。但是怎么办?目前,我正在怀念 C++ 析构函数的纯粹简单性和强大功能以及确定性

最佳答案

Windows 窗体向导在您不应该修改的代码周围放置了特殊的“区域指令”,因此您可以随意修改 Dispose 内容,只要您留在其中模式。

将 IDisposable 视为执行析构函数的 .NET 方式。只要所有实现者都正确,那么结果就可以等同于 C++ 析构函数(事实上,C++/CLI 从析构函数声明生成 Dispose 方法,我非常怀念 C# 中的这个特性)。

了解一些背景知识:http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

有几件事需要注意。首先,disposing 参数告诉您正在调用 Dispose(bool) 虚方法的上下文。如果它是 false,那么 不要做任何事情! 这意味着您正在从终结器线程中调用。这几乎从来没有用过,它是这种模式设计中的一个历史缺陷,因为它混合了 99.99% 有用的东西(确定性销毁逻辑)和只有 0.01% 有用的东西( native 资源的自定义自由线程终结),就好像它们是最好的 friend 。

因此将您自己的清理代码放在if (disposing) 分支中。

其次,请注意向导生成的代码如何在调用 Dispose 之前检查对象引用是否为非空。根据 IDisposable 的定义,您应该期望 Dispose 在同一实例上无缘无故地被多次调用。

所以你想这样做:

if (Form != null)
{
Form.Dispose();
Form = null;
}

关于C# 处理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/971698/

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