我不知道如何使用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
答案 0 :(得分:1)
这对我来说也是一个困惑,但是当我阅读更多有关.Net的内存管理和GC机制的信息时,一切都变得清晰起来。
仅当“ dispose = true”时,才应调用disposeMe.Dispose()。因为它是托管类/资源。我假设它也正确实现了这种处理和析构模式。
为什么您不应该尝试在if(dispose)块之外使用任何托管对象?
因为GC可能不会也不会通过按照所有者到所有者的图表来收集对象。因此,当Destructor调用Dispose方法时,disposeMe对象可能已经被收集并且无法访问。因此,您不能/不应该将它放在此区域中。
但是您可以释放非托管资源,例如分配的非托管内存空间,打开的句柄...由于GC不了解它们,除非您有意释放它们,否则它将无法收集和释放它们。如果不这样做,将会有内存和句柄泄漏,最终将导致应用程序崩溃。