Khi destructor được thực thi chúng hủy tất cả các biến, tham số. Chúng sẽ kiểm tra tất cả các đối tượng được sử dụng trong ứng dụng, xem xét những đối tượng có thể để hủy đi trên bộ nhớ chính. Khi một destructor được gọi thì tất cả phương thức trên lớp cơ sở sẽ bị hủy theo. Vì vậy trước đó destructor hoàn toàn được chuyển thành:
protected override void Finalize()
{
try
{
// Cleaning up .
}
finally
{
base.Finalize();
}
}
Chúng ta sẽ xem xét ví dụ về cách thức gọi một destructor như thế nào. Chúng ta có 3 lớp A, B, C. B kế thừa từ A, và C kế thừa từ B, mỗi lớp đều có riêng phương thức constructor và destructor. Trong lớp program chúng ta tạo lớp C.
class A
{
public A()
{
Console.WriteLine("Creating A");
}
~A()
{
Console.WriteLine("Destroying A");
}
}
class B : A
{
public B()
{
Console.WriteLine("Creating B");
}
~B()
{
Console.WriteLine("Destroying B");
}
}
class C : B
{
public C()
{
Console.WriteLine("Creating C");
}
~C()
{
Console.WriteLine("Destroying C");
}
}
class Program
{
public static void Main()
{
C c = new C();
Console.WriteLine("Object Created ");
Console.WriteLine("Press enter to Destroy it");
Console.ReadLine();
c = null;
Console.Read();
}
}
Chương trình sẽ đợi cho đến khi người dùng nhấn ‘enter’. Khi đó chúng ta sẽ gán lớp C là null. Nhưng như vậy thì destructor của lớp C không được thực hiện. Như chúng ta đã nói, chương trình sẽ không được ‘điều khiển’ khi destructor được gọi bởi chúng sẽ thu dọn tất cả các biến, tham số…Nhưng destructor được gọi khi chương trình kết thúc. Bạn có thể kiểm tra bằng cách gọi một lần nữa và xuất ra file hay màn hình chúng ta sẽ có kết quả:
Creating A
Creating B
Creating C
Object Created
Press enter to Destroy it
Destroying C
Destroying B
Destroying A
Chú ý rằng destructor của các lớp cơ sở cũng được gọi bởi chúng được gọi thông qua
base.Finalize()
Vì vậy chúng ta có thể sử dụng destructor để kết thúc việc sử dụng một đối tượng nào đó.