1. Finalize()从object中继承过来,GC会定期调用该方法来回收内存。编程时不需要覆写Finalize()方法。当我们需要自己定义Finalize()方法时(一般只用于回收非托管资源),并非直接override该方法,可以通过这种方式来覆写:
class Test { // Some Code ~Test { //Necessary cleanup code } }
类似于C++的析构函数,.net Framework 会将该析构函数转换成这样的形式:
protected override void Finalize() { try { //Necessary cleanup code } finally { base.Finalize(); } }
2. 由于我们不能控制GC什么时候去回收内存,所以Finalize的调用时机是不定的,当非常紧急需要回收内存时,我们也不能调用Finalzie()强制回收,这时候就可以使用Dispose():
public interface IDisposable { void Dispose(); }
Dispose()需要手动调用,调用后并不是释放自己,而是等待GC回收(Dispose()后GC可以直接回收了)。
可以将Finalize()和Dispose()结合起来以防止忘记调用Dispose():
public class Base: IDisposable { private bool isDisposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(!isDisposed) { if (disposing) { // Code to dispose managed resources // held by the class } } // Code to dispose unmanaged resources // held by the class isDisposed = true; base.Dispose(disposing); } ~Base() { Dispose (false); } } public class Derived: Base { protected override void Dispose(bool disposing) { if (disposing) { // Code to cleanup managed resources held by the class. } // Code to cleanup unmanaged resources held by the class. base.Dispose(disposing); } // Note that the derived class does not // re-implement IDisposable }