مسیر
/
C#
C#
/
برنامه‌ی درسی
/
پاک‌سازی منابع
پا

پاک‌سازی منابع در C#

2 تمرین

درباره‌ی پاک‌سازی منابع

رابط IDisposable نقش محوری در پاکسازی منابع دارد و دو نقش مهم در C# ایفا می‌کند:

  • به کاربران کلاسی که این رابط را پیاده‌سازی می‌کند اطلاع می‌دهد که مسئول‌اند به کلاس خبر دهند (با فراخوانی متد Dispose()) که دیگر به آن نیازی نیست، تا کلاس بتواند هر منبع مدیریت‌نشده‌ای را آزاد کند یا در صورت لزوم وضعیت داخلی خود را بازنشانی کند. این با رویکرد معمول پاکسازی در تضاد است، یعنی همان جایی که به «جمع‌کننده‌ی زباله» اجازه می‌دهیم همه‌چیز را پاک کند (عمدتاً آزادسازی حافظه).
  • رابط IDisposable در همراهی با کامپایلر و زمان اجرا از دستور using پشتیبانی می‌کند که در تمرین resource-lifetime بررسی شده است.

ممکن است Dispose() در نوعی روال پاکسازی عمومی از طریق رابط فراخوانی شود، اما این احتمال کم است.

بیشتر اوقات IDisposable را در کلاس‌های کتابخانه‌ای می‌بینیم که منابع سیستم‌عامل (منابع مدیریت‌نشده) را بسته‌بندی می‌کنند، مانند System.IO.Stream و System.IO.TextReader. (کلاس‌های Stream و TextReader در تمرین‌های دیگر بررسی می‌شوند).

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

اگر کلاسی که استفاده می‌کنید رابط IDispoable را پیاده‌سازی می‌کند، باید مطمئن شوید که وقتی دیگر به نمونه نیازی نیست، Dispose() فراخوانی می‌شود (با استفاده از بندهای catch و finally). اگر کلاسی عضوی دارد که IDisposable را پیاده‌سازی می‌کند، چه‌بسا خودش هم باید IDisposable را پیاده‌سازی کند تا بتوان Dispose() را فراخوانی کرد و آن عضو پیاده‌سازنده‌ی IDisposble را آزاد کرد.

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

ممکن است رابط IDisposable حتی جایی که هیچ منبع مدیریت‌نشده‌ای در کار نیست هم مفید باشد. فرض کنید شیئی دارید که عمر طولانی دارد و از اشیائی با عمر کوتاه می‌خواهد خود را نزد آن ثبت کنند و سپس وقتی دیگر به آن‌ها نیازی نیست، ثبت‌شان را لغو کنند. پیاده‌سازی IDisposable روی شیء کوتاه‌عمر به توسعه‌دهنده‌ای که از آن کلاس استفاده می‌کند هشدار می‌دهد که در پایان عمر شیء کوتاه‌عمر باید Dispose() فراخوانی شود.

الگوی Dispose

در مستندات ارجاع‌هایی به الگوی Dispose خواهید دید. الگوی Dispose شامل فراخوانی Dispose() از «نابودگر» کلاس و اطمینان از این است که آزادسازی منابع در کلاس‌های پایه به‌درستی انجام شود. الگوی Dispose در تمرینی در آینده بررسی می‌شود.

الگوی Dispose بیشتر به منابع مدیریت‌نشده مربوط می‌شود. اگر از سازوکار P/Inovke و متدهای extern استفاده می‌کنید، باید بدانید الگوی Dispose را چگونه و چه زمانی پیاده‌سازی کنید. بیشتر توسعه‌دهندگان C# به‌ندرت ناچار می‌شوند به این شکل مستقیماً با منابع مدیریت‌نشده سر و کار داشته باشند.

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

پاک‌سازی منابع را یاد بگیرید

تمرین کردن قفل شده است

برای تمرین پاک‌سازی منابع قفل 1 تمرین دیگر را باز کنید