🛡 کستینگ امن در #C: راهنمای کامل اپراتورهای as و is
تو پست قبلی دیدیم که Downcasting (تبدیل پدر به فرزند) با (Stock)a میتونه خطرناک باشه و اگه اشتباه کنیم، با خطای InvalidCastException برنامه کرش میکنه.
اما #C دو تا ابزار خیلی بهتر و امنتر برای این کار داره که جلوی این کرشها رو میگیره: اپراتورهای as و is.
1️⃣ اپراتور as: کستینگ بدون استثنا (Exception)
اپراتور as سعی میکنه عمل downcast رو انجام بده.
✅ اگه موفق بشه، نتیجه رو برمیگردونه.
❌ اگه شکست بخوره، به جای پرتاب Exception، خیلی آروم و بیصدا مقدار null رو برمیگردونه.
این اپراتور برای مواقعی عالیه که شما میخواید نتیجه رو برای null چک کنید.
Asset a = new House(); // a یک House است، نه Stock
Stock s = a as Stock; // خطا رخ نمیدهد، s برابر با null میشود
if (s != null)
{
// این کد اجرا نخواهد شد
Console.WriteLine(s.SharesOwned);
}
💡نکته مهم:
as فقط زمانی خوبه که شما قصد دارید نتیجه رو برای null چک کنید. اگه چک نکنید و روی نتیجهش کاری انجام بدید، ممکنه با خطای مبهم NullReferenceException مواجه بشید.2️⃣ اپراتور is: سوال پرسیدن قبل از عمل
اپراتور is فقط یه سوال true/false میپرسه: "آیا این آبجکت از این نوع هست (یا قابل تبدیل به این نوعه)؟" این روش کلاسیک برای جلوگیری از خطای کستینگه.
// روش قدیمی ولی امن
if (a is Stock)
{
Stock s = (Stock)a; // حالا که مطمئنیم، با خیال راحت کست میکنیم
// ...
}
3️⃣ جادوی مدرن: is با Pattern Variable ✨
این روش مدرن و پیشنهادی امروزه. شما میتونید همزمان با چک کردن نوع، اگه شرط درست بود، نتیجه کست رو مستقیماً داخل یه متغیر جدید بریزید! این کار کد رو فوقالعاده تمیز و کوتاه میکنه.
Asset a = new Stock { SharesOwned = 500 };
if (a is Stock s)
{
// دیگه نیازی به کست جداگانه نیست!
// s همینجا از نوع Stock و قابل استفاده است
Console.WriteLine(s.SharesOwned); // 500
}ترفند حرفهای: شما حتی میتونید از این متغیر جدید، در ادامهی همون شرط استفاده کنید!
if (a is Stock s && s.SharesOwned > 100)
{
Console.WriteLine("This is a significant stock holding!");
}
🤔 حرف حساب و تجربه شما
استفاده از as و به خصوص is با pattern variable، کد شما رو در کار با سلسلهمراتب وراثت، خیلی امنتر و خواناتر میکنه.
🔖 هشتگها:
#Casting #is #as