An implementation of Object.Finalize for a particular class in .NET should always call the Finalize method of its base class. In the case of C#, you can’t explicitly override Finalize, but you provide a finalizer using the destructor (~) syntax. When you do this, the compiler will automatically add code to ensure that your destructor calls Finalize in the base class.
In the example below, I write a simple destructor for the Dog class. We can see in the IL that the Finalize method has been overridden and that it calls System.Object.Finalize in the finally clause.
1 2 3 4 | ~Dog(){ Trace.WriteLine("This dog is on the way out..");} |

