如果我的类没有析构函数,那么GC会调用Finalize()吗?

时间:2010-04-15 11:53:19

标签: .net asp.net garbage-collection

如果我的类没有析构函数,那么它就超出了范围。 GC在某个时间运行,现在它只是从我的类中回收内存,还是会调用它的析构函数或者Finalize()?

像SQLConnection这样的.net框架类是否实现了析构函数?我看到它有一个Dispose()实现,但没有看到使用“转到定义”的析构函数。

6 个答案:

答案 0 :(得分:2)

阅读本文可能有所帮助,但据我所知,如果有一个析构函数/ Finalize将会被调用,否则GC会悄悄地释放内存。

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

答案 1 :(得分:2)

如果一个对象没有析构函数,那么它首先不会被添加到终结队列中,所以GC会在它清理时释放内存等。

GC仅调用终结队列中对象的析构函数/终结代码。

答案 2 :(得分:2)

仅当对象放在终结队列上时才会在对象上调用Finalize。把它放在那里的方法是给它一个析构函数。在C#中,如果没有析构函数,则该对象不会被放置在终结队列中。

正如其他人指出的那样,除非你必须放慢垃圾收集,否则不要使用析构函数。当GC发现可以回收这样的对象时,它不会释放内存,而是将对象放在终结队列中。换句话说,对象在初始GC中存活,并且只有在执行终结器后才会被回收

答案 3 :(得分:1)

这很可怜。所有那些在一无所知的情况下“回答”这个问题,也没有回答这个问题的人都感到羞耻。

这是你的答案:

在对象变得不可访问后自动调用此方法,除非通过调用SuppressFinalize来豁免对象的最终化。在关闭应用程序域期间,会自动调用Finalize,这些对象不会被终止,即使是那些仍然可访问的对象。 Finalize在给定实例上仅自动调用一次,除非使用ReRegisterForFinalize和GC等机制重新注册该对象。随后未调用GC.uppressFinalize。

自:

http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

答案 4 :(得分:0)

据我所知,Finalize()的默认实现没有任何作用,所以如果它调用与否则无关紧要。

绝大多数课程都不需要自定义终结器,如果您正在使用托管资源,Garbage Collector将能够清理它。

如果您的类没有使用非托管资源,那么您应该避免使用Finalize实现,因为它们需要时间。

答案 5 :(得分:0)

can't call a destructor in C#本身。它们会自动调用。

您可以实例化一个新对象,只要管理其所有资源(读取:不实现IDisposible),它将在以下情况下被垃圾收集:

  • 垃圾收集器决定运行
  • 没有任何引用指向该对象

对于实现IDisposible的类,最好的办法是将它们的用法包装在using语句中,以确保在该对象超出范围时调用Dispose()方法

推荐阅读