چقدر خوب ميشد اگر IDE ويژوال استوديو دات نت اشيايي از نوع disposable را براي ما مشخص ميكرد و در ادامه پيشنهاد استفاده از عبارت
using را براي آنها ميداد؟
سؤال: اين مساله چه اهميتي دارد؟
به مثال متداول زير دقت بفرمائيد:
string connString = "...";
SqlConnection conn = new SqlConnection(connString);
string cmdString = "select * from author where name=N'test'";
SqlCommand cmd = new SqlCommand(cmdString, conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
...
}
conn.Close();
اين مثالي است كه در اكثر سايتهاي آموزشي ميتوان يافت. باز كردن كانكشن به ديتابيس، اجراي كوئري و دريافت اطلاعات حاصل و در آخر بستن كانكشن. بسيار هم خوب! در اين مثال اگر name مساوي test وجود نداشته باشد، روند اجراي برنامه در اولين reader.Read با يك exception متوقف خواهد شد. يعني عملا ممكن است به بستن كانكشن نرسيم (هيچ الزامي وجود ندارد كه كدهاي ما سطر به سطر اجرا شوند). اين مورد چه مشكلي را ايجاد خواهد كرد؟ فقط كافي است سايت ما 100 نفر بازديد كننده داشته باشد. در مدت زمان كوتاهي كل سايت با خطاي زير از كار ميافتد و پيغامي كه از كاربران دريافت خواهيد كرد اين است: "باز هم برنامه كند شد، "بازهم" سايت كار نميكنه ..."
Exception Details: System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
روش صحيح براي مقابله با اين نوع خطاها قرار دادن قسمت بستن كانكشن در قسمت finally يك try/finally است تا مطمئن باشيم كه حتما اين قسمت اجرا خواهد شد. روش زيباتر اينكار استفاده از عبارت using است. عبارت using نيز در نهايت به يك try/finally توسط كامپايلر
بسط داده خواهد شد اما كد حاصل در اين حالت خواناتر است. بنابراين در اين حالت حتي اگر خطايي نيز رخ دهد، شيء مورد نظر حتما dispose خواهد شد. (از دات نت 2 به بعد عبارت using به VB.Net نيز
افزوده شده است)
using (SqlConnection connection =
new SqlConnection(connectionString))
{
...
عبارت using را تنها در مورد اشيايي از نوع IDisposable ميتوان بكار برد. يكي از تواناييهاي پلاگين Agent Johnson تشخيص اين مورد و گوشزد كردن آن است (شكل زير):
Agent Johnson در حقيقت پلاگيني است براي پلاگين ديگري به نام
Resharper . اين پلاگين را از آدرس زير ميتوان دريافت كرد (احتمالا به يك پروكسي نياز خواهد بود ...):
http://code.google.com/p/agentjohnsonplugin/البته بحث تشخيص اشياء disposable يكي از تواناييهاي آن است. ساير موارد را در آدرس فوق ميتوانيد مشاهده نمائيد.