如何使用处置/最终化方法正确处理类变量

时间:2018-09-29 06:47:24

标签: c# memory-management dispose finalize

我不知道如何使用Dispose / Finalize方法处理包含变量的类。我希望该类包含自己的Dispose / Finalize方法,这些方法为每个变量调用Dispose。但是,C#文档和StackOverflow上的所有其他答案/示例都引起了一些混乱。

主要的困惑来自缺乏对“托管”或“非托管”对象之间的澄清。例如,解释如何实现Dispose的文档here仅使用占位符注释,该注释仅声明“在此处释放任何非托管对象”。或“在此处释放任何其他托管对象。”

具有Dispose / Finalize的类变量属于托管类还是非托管类? (此外,我应该担心不包含任何类型的Dispose / Finalize实现的类变量吗?考虑到“管理”有两种类型,这是否意味着仍需要以某种方式处理没有“ Dispose”的变量?)

即,处理此类的正确方法是什么?

groupViewChildPosition: 1 = Activity Num 1
groupViewChildPosition: 2 = Activity Num 2
groupViewChildPosition: 3 = Activity Num 3

1 个答案:

答案 0 :(得分:1)

这对我来说也是一个困惑,但是当我阅读更多有关.Net的内存管理和GC机制的信息时,一切都变得清晰起来。

仅当“ dispose = true”时,才应调用disposeMe.Dispose()。因为它是托管类/资源。我假设它也正确实现了这种处理和析构模式。

为什么您不应该尝试在if(dispose)块之外使用任何托管对象?

因为GC可能不会也不会通过按照所有者到所有者的图表来收集对象。因此,当Destructor调用Dispose方法时,disposeMe对象可能已经被收集并且无法访问。因此,您不能/不应该将它放在此区域中。

但是您可以释放非托管资源,例如分配的非托管内存空间,打开的句柄...由于GC不了解它们,除非您有意释放它们,否则它将无法收集和释放它们。如果不这样做,将会有内存和句柄泄漏,最终将导致应用程序崩溃。