استفاده کارآمد از دستور Using برای آزاد سازی بهتر منابع
سلام به همه دوستان عزیز
مدیریت منابع و آزادسازی اشیاء یکی از بحث های مهم برنامه نویسی ست . توصیه میکنم حتما مطالب این سرفصل رو پیگیری کنید .
به هر حال زمانی که از یک کلاس ، شی ساخته میشود حتما پس از استفاده می باید آنرا از بین برد و منابع مورد استفاده اش را آزاد کرد .
هر چند که وقتی یک کلاس را خراب میکنید در همان لحظه توسط کامپایلر منابعش آزاد نمی شود .
حال نمونه کد زیر را در نظر بگیرید
TextReader reader = new StreamReader(filename);
String line ;
While ((line=reader.ReadLine()) !=null)
{
Console.WriteLine(line);
}
Reader.close ;
این کد یک مشکل اساسی دارد . در واقع در برابر exception ایمن نیست . اگر فراخوانی ReadLine یا WriteLine مشکلی ایجاد کند آنگاه متد close فراخوانی نمیشود .
برای بهینه شدن این کد بدین شکل عمل میشود .
TextReader reader = new StreamReader(filename);
Try
{
String line ;
While ((line=reader.ReadLine()) !=null)
{
Console.WriteLine(line);
}
}
Finally
{
Reader.close ;
}
با این کد حتی اگر خطایی هم رخ دهد متد Close اجرا خواهد شد .
اما استفاده از Finally چند مشکل دارد .
1 – اگر مجبور باشید چند منبع را آزاد کنید این روش ناکارآمد است .
2 – فهم راه حل مشکل است و هر بار باید تکرار شود .
3 - در خیلی از مواقع لازم است در کد تغییرات زیادی انجام دهید .
4 – ارجاع به منبع حتی بعد از بلاک Finally هم باقی میماند . یعنی ممکن است بعد از آزاد شدن منبع تصادفا مورد استفاده واقع شود . زیرا که منبع در سراسر برنامه قابل دسترسی است .
اما استفاده از دستور Using برای بهینه شدن این کد .
Using ( try variable = initialization ) embeddedStatement
این دستور معادل دستورات زیر است :
{
Type variable = initialization ;
Try
{
embeddedStatement
}
Finally
{
If (variable != Null)
{
((Disposable)variable).Dispose();
}
}
}
پس بهترین راه برای اینکه مطمئن شوید متد Close همیشه فراخوانی شود به شکل زیر است :
Using(TextReader reader = new StreamReader(filename)
{
String line ;
While((line = reader.ReaderLine()) != )
{
Console.WriteLine(line);
}
}
مزایای این روش :
1 – برای آزاد سازی چندین منبع به خوبی کار می کند .
2 – منطق برنامه را خراب نمی کند
3- از تکرار جلوگیری میکند .
4 – بعد از دستور Using دیگر نمیتوان از منبع استفاده کرد . زیرا آن منبع در خارج از محدوده Using قابل دسترسی نیست . ( * این مورد بهترین مزیت این دستور است زیرا یکی از پر اشکال ترین موارد در آزاد سازی منابع استفاده تصادفی دوباره از آن منبع است . )
پایدار باشید .
نقل قول: استفاده کارآمد از دستور Using برای آزاد سازی بهتر منابع
اگه بخاهیم یک متغییر رو بعدا هم استفاده کنیم چی؟
می شه یه راه بگید که در هنگام فرم close حتما اشیاء حذف شوند
نقل قول: استفاده کارآمد از دستور Using برای آزاد سازی بهتر منابع
با سلام خدمت دوستان
ولی میشه هروقت که بخواهیم عملیات Garbage Collection را در #C انجام بدیم با دستور زیر
GC.Collect();