TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 549 subscribers
Post #211 137
📖 سری آموزشی کتاب C# 12 in a Nutshell

🛡 کستینگ امن در #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
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →