What is the difference, if there is one, between a destructor and a Finalize method in a class?
I recently discovered that Visual Studio 2008 considers a destructor synonymous with a Finalize method, meaning that Visual Studio won't let you simultaneously define both methods in a class.
For example, the following code fragment:
class TestFinalize { ~TestFinalize() { Finalize(); } public bool Finalize() { return true; } }
Gives the following error on the call to Finalize in the destructor:
The call is ambiguous between the following methods or properties: 'TestFinalize.~TestFinalize()' and 'TestFinalize.Finalize()'
And if the call to Finalize is commented out, it gives the following error:
Type 'ManagementConcepts.Service.TestFinalize' already defines a member called 'Finalize' with the same parameter types
Wikipedia has some good discussion on the difference between a finalizer and a destructor in the finalizer article.
C# really doesn't have a "true" destructor. The syntax resembles a C++ destructor, but it really is a finalizer. You wrote it correctly in the first part of your example:
~ClassName() { }
The above is syntactic sugar for a Finalize
function. It ensures that the finalizers in the base are guaranteed to run, but is otherwise identical to overriding the Finalize
function. This means that when you write the destructor syntax, you're really writing the finalizer.
According to Microsoft, the finalizer refers to the function that the garbage collector calls when it collects (Finalize
), while the destructor is your bit of code that executes as a result (the syntactic sugar that becomes Finalize
). They are so close to being the same thing that Microsoft should have never made the distinction.
Microsoft's use of the C++'s "destructor" term is misleading, because in C++ it is executed on the same thread as soon as the object is deleted or popped off the stack, while in C# it is executed on a separate thread at another time.
A destructor in C# overrides System.Object.Finalize
method. You have to use destructor syntax to do so. Manually overriding Finalize
will give you an error message.
Basically what you are trying to do with your Finalize
method declaration is hiding the method of the base class. It will cause the compiler to issue a warning which can be silenced using the new
modifier (if it was going to work). The important thing to note here is that you can't both override
and declare a new
member with identical name at the same time so having both a destructor and a Finalize
method will result in an error (but you can, although not recommended, declare a public new void Finalize()
method if you're not declaring a destructor).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With