CLR破坏.NET对象

时间:2011-02-17 15:16:21

标签: .net clr

如果没有任何dispose()或者终止模式被clr破坏的.NET对象怎么样? 是否被Object Finalize方法清除了!

4 个答案:

答案 0 :(得分:7)

不,如果对象没有声明显式终结器,它永远不会被添加到可释放的队列中 - 它的内存只是被回收。

这是你不应该宣布终结者的原因之一,除非你确实需要终结者。任何具有终结器的对象都需要两次完全收集GC。


来自Object.Finalize

  

Object.Finalize没有做任何事情   默认。它必须被a覆盖   派生类仅在必要时,   因为垃圾回收   收集往往需要更长的时间   如果必须运行Finalize操作。

我还建议您查看Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework

答案 1 :(得分:0)

垃圾收集器最终将回收对象使用的内存,之后任何引用都无法再访问它。除非对象具有终结器,否则这是唯一的清理。

答案 2 :(得分:0)

请参阅此article以全面了解Dispose模式的功能。

  

在某些情况下,您可能希望为使用对象的程序员提供在垃圾收集器释放对象之前显式释放这些外部资源的能力。如果外部资源稀缺或昂贵,如果程序员在不再使用资源时明确释放资源,则可以实现更好的性能。

答案 3 :(得分:0)

最简单的想象是.net中的垃圾收集器操作的方式类似于保龄球刀排除器清除“死木”(敲击引脚)的方式:

  1. 将不应被清除的所有引脚(即仍然站立的引脚)移离小巷表面。
  2. 将清扫车穿过巷道的整个表面,清除那里的任何东西。
  3. 放回别针。

请注意,在操作的任何阶段,置瓶机都会检测或锁定任何翻转的引脚。它既不知道也不关心是否有一个这样的引脚或其中的九个(如果没有引脚站立,置瓶机将记录一次击打并跳过帧的后半部分)。从置瓶机的角度来看,这些引脚也可能不存在,直到它们到达可以回收它们的机制为止。