خوب حالا میرسیم به یه مسئله جذاب دیگه که استفاده از as و is هستش، حالا چطوری؟ اینطوری:
public class Base{} public class Derived : Base{} object b = new Base(); Console.WriteLine(b is Base); // output : True Console.WriteLine(b is Derived); // output : False object d = new Derived(); Console.WriteLine(d is Base); // output : True Console.WriteLine(d is Derived); // output : True
توی مثالی که در بالا نوشته شده میایم از is برای چک کردن تایپ اون کلاس استفاده میکنیم، یعنی چی؟
یعنی این که به طور مثال آیا b از نوع و تایپ Base هست؟ خوب میبنیم که خروجیش شده true
حالا ایا b از نوع و تایپ Derived هستش؟ خیر و اینجا جوابش false هستش
حالا در مرحله ی بعد اومدیم از کلاس Derived که مشتق شده از کلاس Base هستش یه instance میسازیم و حالا میایم با is چکش میکنیم:
آیا d از نوع و تایپ کلاس Base هستش : جوابش True هستش
آیا d از نوع کلاس مشتق شده هستش : جوابش True هستش
حالا توی مثال بالا استفاده is رو دیدیم ، حالا میخوایم مدل استفاده as رو ببینیم چجوریه:
Base a = new Derived(); Derived b = (Derived)a
خوب همونطوری که میبنید اینجا یه downcast اتفاق افتاده ، حالا یعنی چی؟ یعنی این که یک کلاس پدر رو ریختیم داخل یک کلاس مشتق شده از کلاس پدر.
در این حالت اگر به هر دلیلی downcasting به مشکل بخوره به ما ارور میده.
مدل بعدی استفاده از as هستش :
Derived b = a as Derived
حالا تفاوت مدل اولی با دومی چیه؟؟ اینه که توی حالت دوم اگر نتونه به هر دلیلی تبدیل رو انجام بده به ما null میده
b= null
حالا بیایم ببینیم این دو در کنار هم کاربردشون چیه؟
public class Program { static void Main(string[] args) { Test test = new Test(); test.TypeCheck(); } public class Base{ } public class Derived : Base { } public class Test { public void TypeCheck() { object c = new Derived(); if (c is Base) { Base myObj = c as Base; } } } }
کاربردش اینه که اول میایم با is چک میکنیم ببینیم که آبجکتی که داریم از اون نوعی که مد نظر ما هستش یا نه و بعد اگر بود میایم با as تبدیلش میکنیم به تایپی که میخوایم.