0

如题,当一个表单被处理掉时,所有的form数据都datasets被处理掉了吗?

例子:

Dim C As New Commands
C.ShowDialog
C.Disopse()

因此Cform 包含datasetsoledbconnections更多未处理的对象。如果不是,那么释放内存和释放所有资源的最佳方法是什么?

4

2 回答 2

0

与其他 .NET 对象一样,您不能保证在处置表单时会处置数据集。这是因为 .NET 不断监视内存中是否存在指向对象的活动指针。如果没有找到链接,它会释放分配给对象的内存。这样的过程称为垃圾收集——CLR 的一个特性。

问题是您可以在另一个表单、类甚至另一个项目中拥有一个指向同一数据集的变量。您可以根据需要生成任意数量的这些变量。作为开发人员,您必须制定策略来控制谁以及如何使用您的对象。否则,您将永远不会知道在任何给定时刻是否实际处理了特定数据集。

using 子句有助于控制对象的处置,但它不是最终的解决方案。如果您不知道自己在做什么,您仍然会遇到麻烦。有时您需要故意将未处理的连接对象传递给其他函数,以便对数据处理进行更精细的控制。

于 2013-01-19T02:52:48.870 回答
0

表单的 .Dispose() 方法用于处理表单使用的其他非托管 GDI 资源。由于该方法对您可能添加的内容一无所知,因此您无法确定数据集等项目是否也已处理。

您可以期望的最好结果是,由于对表单进行 Dispose() 处理也高度表明该表单即将成为垃圾收集的条件,您的其他资源也可能即将成为垃圾收集的条件。如果这些类型的 Dispose() 和终结器模式正确实现,那么您的其他项目很可能很快就会被释放。多快是不可能的……这就是存在 dispose 模式的原因:当您需要确保立即清理非托管资源时。

我建议释放任何额外资源的方法是覆盖普通的 Windows 窗体 Dispose() 方法。Dispose() 方法的新实现将使用 MyBase 关键字调用基本实现,并为表单的任何 IDisposable 成员调用 Dispose()。这样,表单仍将作为 Using 块的一部分正常工作。

于 2013-01-19T03:02:20.710 回答