using System; namespace Client.Chapter_5___Building_Your_Own_Classes { public class DTOR: IDisposable { public static int[] MyIntArray; private static int ObjectCount = 0; private bool Disposed = false; static void Main(string[] args) { MyIntArray = new int[10]; ObjectCount++; } //Used to clean up and free unmanaged resources //Never mark this class as virtual as you do not want derived //classes to be able to override it. public void Dispose() { //if this class is derived then call the base //class dispose. //base.Dispose(); //Call the overloaded version of dispose Dispose(true); //Tell the CLR not to run the finalizer this way //you do not free unmanaged resources twice GC.SuppressFinalize(this); } //If user calls dispose both managed and unmanaged resources //are freed //If the finalizer is called then only unmanaged resources are freed private void Dispose(bool disposing) { if(!this.Disposed) { if(disposing) { //free any managed resources } //free unmanaged resources } Disposed = true; } //This finalizer method is called by the GC, //not the user. The net result of having this is that //the object will always survive the first GC cycle and //will be collected the next time GC1 is collected. ~DTOR() { Dispose(false); } } }