We implement the Finalize
method to release unmanaged resources. First let’s see what are managed and unmanaged resources. Managed ones are those,
which we write in .Net languages. But when we write code in any non .NET language like VB 6 or any windows API, we call it as unmanaged. And there are very
high chances that we use any win API or any COM component in our application. So, as managed resources are not managed by CLR, we need to handle them at our own.
So, once we are done with unmanaged resources, we need to clean them. The cleanup and releasing of unmanaged is done in Finalize()
. If your class is not using any
unmanaged resources, then you can forget about Finalize()
. But problem is, we can’t directly call Finalize()
, we do not have control of it. Then who
is going to call this. Basically GC calls this. And one more thing to remember is, there is no Finalize
keyword that we will write and implement it.
We can define Finalize
by defining the Destructor. Destructor is use to clean up unmanaged resourced. When u will put ~ sign in front of class name,
it will be treated as destructor. So, when code is compiled, the destructor is going to convert that into Finalize and further garbage
collector will add it to the Finalize queue. Let’s take this sample code:
class A {
public A()
{ Console.WriteLine("I am in A"); }
~A()
{ Console.WriteLine("Destructor of A"); }
}
class B : A {
public B()
{ Console.WriteLine("I am in B"); }
~B()
{ Console.WriteLine("Destructor of B"); }
}
class C : B {
public C()
{ Console.WriteLine("I am in C"); }
~C()
{ Console.WriteLine("Destructor of C"); }
}
Now using Reflector, we will see, if Destructor, really converted to Finalize:
And wow, it’s really done. Here we can see that there is nothing like destructor. Basically destructor is overriding the Finalize
method.
Hope it helps!!!