PDA

View Full Version : سوال: فلسفه using



طبیب دل
سه شنبه 24 بهمن 1391, 19:41 عصر
با سلام به دوستان
کسی می دونه فلسفه دستور using
و دستوراتی که داخل اون می نویسن چیهg

SHD.NET
سه شنبه 24 بهمن 1391, 20:37 عصر
سلام.

توضیحات در MSDN مایکروسافت (http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx)
این تاپیک (http://barnamenevis.org/showthread.php?297083-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-using-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F) هم یه چیزایی توضیح داده

**موفق و مؤید**

danialafshari
سه شنبه 24 بهمن 1391, 20:41 عصر
سلام
برای پاسخ به این سوال باید کمی در نحوه ی کار CLR دقیق شویم
Using برای ایجاد شی از کلاس هایی استفاده میشود که اینترفیس IDisposable را پیاده سازی کرده اند. این اینترفیس دارای متدی است با نام Dispose ، هنگامی که ما یک بلاک Using ایجاد میکنیم مانند زیر:
using (MyDisposableClass c = new MyDisposableClass())
{
// ToDo : Something
}
این تعریف ما خود به خود به تعریف زیر در زبان IL تبدیل خواهد شد
MyDisposableClass c = new MyDisposableClass();
try
{
// ToDo : Something
}
finally
{
c.Dispose();
}
معمولا کلاس هایی که اینترفیس مذکور را پیاده سازی میکنند، آنهایی هستند که به یک یا چند منبع از منابع Unmanaged سیستم دسترسی دارند و استفاده میکنند. این منابع معمولا دارای محدودیت در استفاده هستند. هنگامی که شما کارتان با یک متغییر تمام میشود، به راحتی اجازه میدهید که GC عملیات جمع آوری آن را انجام دهد. اما ماموریت GC جمع آوری اطلاعات هرز و آزاد سازی حافظه است نه آزاد سازی منابع سیستمی.
اجازه بدهید از مثالی که برای خودم پیش آمده است استفاده کنم. من یک نرم افزار ارسال پیامک از طریق مودم های GSM طراحی کرده بودم. برای ارسال یک پیامک باید ابتدا یک شی از کلاس مودم ساخته میشد و بعد از یکسری تنظیمات، پیامک ارسال میشد. هنگامی که من از این کلاس بدون استفاده از بلاک Using استفاده میکردم، و بدون فراخوانی متد Dispose کار را به عهده ی GC قرار میدادم، دو مشکل پیش می آمد: اول اینکه حافظه ی مصرفی بازگردانی نمی شد تا زمانی که سیستم با مشکل کمبود حافظه مواجه میشد یا اینکه مستقیم متد GC.Collect فراخوانی میشد.، دوم و مهمتر اینکه، چون مودم جزو منابع محدود سیستم بود و در آن واحد تنها یک برنامه میتوانست به آن متصل شود، مودم در حالت مشغول باقی میماند و در صورتی که مجددا قصد استفاده از مودم را داشتم، خطای Modem is already in use صادر میشد. دلیل هم این بود که گرچه GC کار خود را درست انجام داده بود و شی ایجاد شده را از حافظه خارج ساخته بود، اما چون این عملیات، روند صحیح خود را طی نکرده بود، مودم هنوز برای شی قبلی رزرو شده بود.
این مشکل در مورد بسیار از کلاس ها که با منابع سیستم کار میکنند پیش خواهد آمد، مانند: شبکه، فایل ها، فونت ها، سخت افزارهای جانبی و ... . برای پایان به روند استفاده از یک منبع باید از متد Dispose استفاده نمایید حال میتوانید از Using Block استفاده نمایید و یا مانند نمونه ای که بیان شد به صورت دستی فراخوانی کنید که البته توصیه نمیشود.
منبع : همکدی
موفق باشی