🛡 دستور using در #C: بهترین دوست IDisposable و راهی برای جلوگیری از نشت منابعوقتی با فایلها، دیتابیس، ارتباطات شبکه یا هر منبع خارجی دیگهای کار میکنید، یه خطر بزرگ وجود داره: یادتون بره منابعی که باز کردید رو ببندید! این کار باعث "نشت منابع" (Resource Leaks) و مشکلات جدی در پرفورمنس و پایداری برنامه میشه.
سیشارپ یه راه حل خیلی شیک، امن و حرفهای برای این مشکل داره: دستور using.
1️⃣ مشکل کجاست؟ IDisposable و مدیریت منابع
بعضی از آبجکتها در داتنت، منابعی رو مدیریت میکنن که Garbage Collector به صورت خودکار نمیتونه اونها رو آزاد کنه (مثل دستگیره فایل در سیستمعامل). این کلاسها، اینترفیس IDisposable رو پیادهسازی میکنن که فقط یک متد به اسم Dispose() داره.
وظیفه ما به عنوان برنامهنویس اینه که همیشه و تحت هر شرایطی، بعد از تموم شدن کارمون با این آبجکتها، متد Dispose() اونها رو صدا بزنیم.
2️⃣ راه حل قدیمی (و زشت): try...finally 👎
راه سنتی برای اینکه مطمئن بشیم Dispose() همیشه صدا زده میشه (حتی اگه وسط کار یه Exception رخ بده)، استفاده از بلوک try...finally هست:
StreamReader reader = null;
try
{
reader = new StreamReader("myFile.txt");
// ... کار کردن با فایل ...
}
finally
{
if (reader != null)
{
reader.Dispose(); // تضمین میکنه که فایل همیشه بسته میشه
}
}
این کد کار میکنه، ولی طولانی و زشته.
3️⃣ راه حل مدرن و شیک: دستور using ✨
دستور using یه "شکر سینتکسی" (Syntactic Sugar) برای همون بلوک try...finally هست.
به محض اینکه اجرای کد از بلوک using خارج بشه (چه به صورت عادی و چه به خاطر یه Exception)، کامپایلر به صورت خودکار متد Dispose() رو روی اون آبجکت صدا میزنه. اینجوری کد شما خیلی تمیزتر، کوتاهتر و امنتر میشه.
// این کد دقیقاً معادل کد try...finally بالاست
using (StreamReader reader = new StreamReader("myFile.txt"))
{
// ... کار کردن با فایل ...
}
// reader.Dispose() اینجا به صورت خودکار در هر حالتی صدا زده میشه
4️⃣ فرم جدیدتر (از C# 8): using declarations 🚀
از C# 8 به بعد، کار حتی از این هم سادهتر شده. اگه متغیر using رو به این شکل تعریف کنید، دیگه نیازی به آکولاد {} ندارید و اون متغیر در انتهای اسکوپ فعلی (معمولاً در انتهای متد) به صورت خودکار Dispose میشه.
void ReadFile()
{
using var reader = new StreamReader("myFile.txt");
using var writer = new StreamWriter("log.txt");
// ... کار کردن با فایلها ...
} // reader.Dispose() و writer.Dispose() اینجا به صورت خودکار صدا زده میشن
🤔 حرف حساب و قانون طلایی
قانون طلایی: هر کلاسی که IDisposable رو پیادهسازی کرده، باید داخل یه بلوک using (یا با سینتکس جدیدش) ازش استفاده بشه.
شما بیشتر از کدوم فرمت using استفاده میکنید؟ کلاسیک با براکت یا فرمت جدید بدون براکت؟
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #BestPractices #CleanCode #IDisposable