چرا آرایهها از لبه پرت میشوند؟
یکی از اولین و رایجترین خطاهای زمان اجرایی که هر برنامهنویس #C باهاش روبرو میشه، همین IndexOutOfRangeException هست. اون لحظهای که فکر میکنی همه چی درسته، ولی برنامه با این خطا کرش میکنه.
اما این خطا دشمن شما نیست، بلکه یه نگهبان مهمه! بیاید ببینیم داستانش چیه و چرا وجودش برای ما خوبه.
1️⃣ بررسی محدوده (Bounds Checking) چیست؟
وقتی شما یک آرایه میسازید، در واقع یک محدوده مشخص در حافظه تعریف میکنید. Bounds Checking یعنی CLR (محیط اجرای داتنت)، قبل از دسترسی به هر خانهی آرایه، مثل یه نگهبان با دقت چک میکنه که آیا ایندکسی که دادی، تو محدوده مجاز آرایه هست یا نه.
اگه از محدوده خارج بزنید، اون نگهبان جلوتون رو میگیره و خطای IndexOutOfRangeException رو پرتاب میکنه.
// آرایهای با ۳ عنصر که ایندکسهای مجاز آن 0, 1, 2 هستند
int[] arr = new int[3];
arr[0] = 10; // ✅ مجاز
arr[2] = 30; // ✅ مجاز
// تلاش برای دسترسی به ایندکس 3 که وجود نداره!
arr[3] = 40; // 💥 BOOM! IndexOutOfRangeException
2️⃣چرا این خطا یک "ویژگی" خوب است؟ ✅
شاید اولش از این خطا بدتون بیاد، ولی وجودش دو تا دلیل خیلی مهم داره:
امنیت و پایداری (Safety) :
این بررسی جلوی دسترسی و تخریب ناخواسته بخشهای دیگه حافظه رو میگیره. اگه این خطا نبود، ممکن بود برنامهتون دادههای دیگه رو خراب کنه و هیچوقت نفهمید مشکل از کجاست.
دیباگ آسان :
به جای اینکه برنامهتون با یه رفتار عجیب و غریب به کارش ادامه بده و بعداً یه جای نامربوط کرش کنه، دقیقاً همون لحظه و همون خطی که اشتباه کردی، بهت خطا میده. این دیباگ کردن رو فوقالعاده راحتتر میکنه.
3️⃣آیا این بررسی روی پرفورمنس تأثیر دارد؟ 🚀
شاید فکر کنید این همه چک کردن، برنامه رو کند میکنه. درسته که یه هزینه خیلی جزئی داره، ولی کامپایلر JIT (Just-In-Time) خیلی هوشمنده.
مثلاً، قبل از ورود به یه حلقه، اگه بفهمه تمام ایندکسها امن هستن، چک کردن رو برای کل حلقه بهینه میکنه. پس در ۹۹٪ مواقع، تأثیر این بررسی روی پرفورمنس ناچیز و قابل چشمپوشی است.
نکته حرفهای: البته #C به شما اجازه میده در شرایط خاص و با مسئولیت خودتان، با استفاده از کد unsafe این بررسی امنیتی رو دور بزنید، که یه بحث خیلی پیشرفتهست.🤔 حرف حساب و خاطرات شما
پس دفعه بعدی که این خطا رو دیدید، بهش به چشم یه دشمن نگاه نکنید، بلکه ازش به عنوان یه راهنما که داره اشتباهتون رو دقیق نشون میده، تشکر کنید!
اولین باری که به این خطا برخوردید یادتونه؟ داشتید روی چه کدی کار میکردید؟ بیاید از خاطرات مشترک برنامهنویسیمون بگیم!
ادامهی بحث، سوالات، غر زدنها و گپ و گفتهای خودمونی، فقط تو گروه.
[@CSharpGeeksChat]
🔖 هشتگها :
#CSharp
#ErrorHandling
#DotNet
#Exception