👻 مبحث پیشرفته #C: فاینالایزرها (~Finalizers) و آخرین کلمات یک آبجکت
ما معمولاً نگران از بین بردن آبجکتها در #C نیستیم، چون Garbage Collector (GC) این کار رو به صورت خودکار برامون انجام میده. اما گاهی وقتا یه آبجکت، منابعی خارج از کنترل داتنت (unmanaged resources) مثل دستگیرههای فایل یا اتصالات شبکه رو مدیریت میکنه.
اینجا پای فاینالایزر (Finalizer) به میدون باز میشه.
1️⃣ فاینالایزر چیست؟
فاینالایزر، یه متد خاص در کلاسه که درست قبل از اینکه Garbage Collector حافظهی اون آبجکت رو پاک کنه، به صورت خودکار صدا زده میشه. این آخرین شانس آبجکته که منابع مدیریتنشدهی خودش رو آزاد کنه.
سینتکس فاینالایزر، اسم کلاسه که قبلش یه علامت مد (~) اومده:
class MyClass
{
~MyClass()
{
// کد پاکسازی منابع در اینجا قرار میگیرد
Console.WriteLine("Finalizing object!");
}
}
💡نکته فنی: این سینتکس در واقع یه میانبر شیک در #C برای override کردن متد Finalize از کلاس Object هست.
2️⃣ چرا تقریباً هیچوقت نباید فاینالایزر بنویسید؟ (مهم!) ⚠️
در ۹۹.۹٪ مواقع، شما به عنوان یک توسعهدهنده #C نباید مستقیماً فاینالایزر بنویسید. دلیلش اینه:
• ضربه به پرفورمنس: آبجکتهایی که فاینالایزر دارن، فرآیند پاکسازی حافظه توسط GC رو پیچیده و کند میکنن.
• غیرقطعی بودن: شما هیچ کنترلی روی اینکه فاینالایزر دقیقاً چه زمانی اجرا میشه، ندارید. ممکنه خیلی دیرتر از چیزی که انتظار دارید، اجرا بشه.
راه حل صحیح و مدرن برای مدیریت منابع، پیادهسازی اینترفیس IDisposable و استفاده از دستور using هست که قبلاً در موردش صحبت کردیم.
3️⃣ پس کی به درد میخوره؟ (تنها کاربرد منطقی) 💡
تنها کاربرد منطقی فاینالایزر، به عنوان یه مکانیسم پشتیبان یا Safety Net هست.
یعنی شما کلاس خودتون رو IDisposable میکنید و انتظار دارید که کاربر همیشه متد Dispose() رو (معمولاً با using) صدا بزنه. اما برای محکمکاری، یه فاینالایزر هم مینویسید که اگه کاربر یادش رفت Dispose() رو صدا بزنه، فاینالایزر به عنوان آخرین امید، اون منابع رو آزاد کنه تا از نشت منابع (resource leaks) جلوگیری بشه.
🤔 حرف حساب و تجربه شما
فاینالایزرها مثل دکمه Eject صندلی خلبان هستن؛ امیدوارید هیچوقت لازم نشه ازش استفاده کنید، ولی خوبه که بدونید وجود داره.
🔖 هشتگها:
#CSharp #DotNet #MemoryManagement #GarbageCollector