رابط 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 بیشتر به منابع مدیریتنشده مربوط میشود. اگر از سازوکار P/Inovke و متدهای extern استفاده میکنید، باید بدانید الگوی Dispose را چگونه و چه زمانی پیادهسازی کنید. بیشتر توسعهدهندگان C# بهندرت ناچار میشوند به این شکل مستقیماً با منابع مدیریتنشده سر و کار داشته باشند.