مخرب ها (Destructors)

مخرب‌ها نقطه مقابل سازنده‌ها هستند. مخرب‌ها متدهای خاصی هستند که هنگام تخریب یک شیء فراخوانی می‌شوند. اشیا از حافظه کامپیوتر استفاده می‌کنند و اگر پاک نشوند ممکن است با کمبود حافظه مواجه شوید. می‌توان از مخرب‌ها برای پاک کردن منابعی که در برنامه مورد استفاده قرار نمی‌گیرند استفاده کرد. معمولاً دات نت فریم ورک به صورت اتوماتیک از زباله روب (garbage collection) برای پاک کردن حافظه استفاده می‌کند و لازم نیست شما به صورت دستی اشیا را از حافظه پاک کنید. بعضی اوقات زباله روب کارش را به خوبی انجام نمی‌دهد. به عنوان مثال وقتی یک کانکشن برای پایگاه داده می‌سازید و یا یک فایل متنی را برای خواندن باز می‌کنید. با استفاده از مخرب‌ها، کدی را تعریف می‌کنید که وقتی اجرا می‌شود که یک شیء تخریب شده باشد. معمولاً شیء وقتی تخریب می‌شود که از محدوده خارج شود. دستور نوشتن مخرب کمی با سازنده متفاوت است :

~ClassName()
{
   code to execute;
}

مانند سازنده‌ها، مخرب‌ها باید همنام کلاسی باشند که در آن تعریف شده‌اند. به این نکته توجه کنید که قبل از نام مخرب علامت (~) را درج کنید. یک مخرب نمی‌تواند دارای سطح دسترسی (مانند public) باشد. برنامه زیر نحوه فراخوانی سازنده و مخرب را نشان می‌دهد :

   1: using System;                                        
   2:                                                      
   3: public class Test                                    
   4: {                                                    
   5:     public Test()                                    
   6:     {                                                
   7:         Console.WriteLine("Constructor was called.");
   8:     }                                                
   9:     ~Test()                                          
  10:     {                                                
  11:         Console.WriteLine("Destructor was called."); 
  12:     }                                                
  13: }                                                    
  14:                                                      
  15: public class Program                                 
  16: {                                                    
  17:     public static void Main()                        
  18:     {                                                
  19:         Test x1 = new Test();                        
  20:     }                                                
  21: }
Constructor was called.
Destructor was called.

در کلاس Test یک سازنده و یک مخرب تعریف شده است. سپس در داخل متد Main() یک نمونه از کلاس ایجاد کرده‌ایم. وقتی یک نمونه از کلاس ایجاد می‌کنیم سازنده فراخوانی شده و پیغام مناسب نمایش داده می‌شود. وقتی از متد Main() خارج می‌شویم نمونه ایجاد شده نابود و مخرب فراخوانی می‌شود. دات نت فریم ورک در حقیقت مخرب را به عنوان یک متد که override شده متد Finalize() است، به صورت زیر تفسیر می‌کند :

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

نگران کلماتی مانند Override ،protect و … نباشید. در درس‌های آینده در مورد آنها توضیح می‌دهیم.