مخرب ها (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 و … نباشید. در درسهای آینده در مورد آنها توضیح میدهیم.
سلام و تشکر بابت مطالب ارزشمندتون اگه میشه لطفا کد دوم رو بیشتر توضیح بدین ممنون
سلام، بسیار ممنون بابت لطفتون
شاید حق با شما باشه اینکه یه کم گنگه، ولی یه کم جلوتر مباحثی مانند override و کلمه کلیدی base رو توضیح دادم، که اونا رو بخونید متوجه کد بالا میشین. شاید بهتر بود این کد رو اینجا نمی نوشتم!
سلام مطالب آموزشی شما تا اینجا واقعا خوب بوده فقط تو این بحث یکم مثال کم زدید اخه این مبحث کمی گنگه اگه کد درست مدیریت نشه امکان خطا و یا کرش یا کندی برنامه پیش میاد. راستی اینم بهتر بود بنویسید که تخریب کننده نه پارامتر قبول میکنه ونه هیچ مقدار خروجی میفرسته.کد دوم خوبه ولی باز برای برنامه نویس های تازه وارد بازم کمی قابل هضم نیست.
با اجازه من یک تیکه از متن رو اصلاح کنمnet framework. زباله روبش به طور خودکار حافظه را مدیریت و بخش های بی استفاده را ازاده میکنه ولی وقتی از منابع مدیریت نشده درون یک کلاس استفاده می شود باید باید باید از تخریب کننده استفاده کرد.ممنون.
سلام، بسیار بسیار ممنون بابت راهنمایی تون، حتما تو روزهای آینده این مواردی که فرمودین رو اصلاح می کنم. در ادامه هم اگه به موارد گنگی برخورد کردین بفرمایید تا اصلاح کنم
با تشکر