2010-07-01 148 views
2

这是写在链路http://msdn.microsoft.com/en-us/magazine/bb985010.aspx.NET垃圾收集器

“当应用程序创建一个新对象时,新的运营商分配从堆存储器;如果该对象的类型包含Finalize方法,然后一个指针对象被放置在最终化队列中。“

可有人请澄清我

1)这意味着,只有当我们明确地使用的finalize(使用析构函数),那么物体会去完成队列。 2)每个.NET类通过隐式使用finalize(使用析构函数),因此所有的.net类库对象都会去完成队列。

3)我们喜欢 自定义类什么班组长一个 { } 类A OBJ会去完成与否,cosidering两种情况下(显性/隐性的析构函数)

4)如果上面的类写在非托管代码究竟会happen.It会去完成队列或不

感谢

回答

3

1)是的,它实现最终确定()对象 - 在C#方法(“析构函数”)被添加的最终化-队列。

2)不,大部分.NET类没有Finalizer。如果在类中没有实现该类,那么该类的实例将不会添加到最终队列中。

3)当A类实现为Finalize-Method时,您只会进入最终队列。 (C#中的“析构函数”#

4)未管理的类不受管理。这个不会被垃圾回收,也不会被添加到finalize队列中。

一些一般说明。

  • C#中的'析构函数'不是C++意义上的析构函数。当它被称为等等时,你没有受助者。它用于编写终结器方法的语法糖。
  • 避免终结器,因为它们会增加附加开销。首先,对象必须添加到完成队列中。然后它必须被垃圾收集两次。第一次检测到它不再被使用。第二次终结器方法结束时。
  • 使用IDisposable接口来管理和释放资源。特别是原生资源。
  • 仅使用终结器,用于本机资源的“紧急清理”。基本上你检查对象是否正确放置(IDisposable) - 连接。如果没有,你在终结者中做这项工作,以防止进一步的资源泄漏。
+0

+1,非常重要的一点! – CharithJ 2011-09-30 06:23:10