如果我的类没有析构函数,那么它就超出了范围。 GC在某个时间运行,现在它只是从我的类中回收内存,还是会调用它的析构函数或者Finalize()?
像SQLConnection这样的.net框架类是否实现了析构函数?我看到它有一个Dispose()实现,但没有看到使用“转到定义”的析构函数。
答案 0 :(得分:2)
阅读本文可能有所帮助,但据我所知,如果有一个析构函数/ Finalize将会被调用,否则GC会悄悄地释放内存。
答案 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()
方法
推荐阅读: