فحص الأنواع في C#: typeof، GetType() أم is؟ متى نستخدم ماذا؟
مرحبًا بالجميع! أنا مطور C# مبتدئ ولا أستطيع فهم فحص الأنواع في C#. هناك ثلاث طرق: العامل `typeof`، الأسلوب `GetType()`، والعامل `is`. لكن متى نستخدم أيًا منها؟
إليك مثال يربكني:
```csharp
object obj = "Hello, world!";
// الطريقة 1
if (obj.GetType() == typeof(string))
Console.WriteLine("هذه سلسلة نصية (GetType)");
// الطريقة 2
if (obj is string)
Console.WriteLine("هذه سلسلة نصية (is)");
// الطريقة 3
Type t = typeof(string);
if (obj.GetType() == t)
Console.WriteLine("هذه سلسلة نصية (typeof)");
```
جميع الخيارات الثلاثة تعمل، لكني أشعر أنها ليست قابلة للتبادل. على سبيل المثال، سمعت أن `typeof` يعمل فقط مع الأنواع في وقت الترجمة (compile time)، بينما `GetType()` يعمل في وقت التشغيل (runtime). أما `is` فهو سحري نوعًا ما - يبدو أنه يتحقق من النوع ويقوم بالتحويل (casting) في نفس الوقت.
أرجو التوضيح:
1. ما الفرق الجوهري بين `typeof` و `GetType()` و `is`؟
2. متى نستخدم أيًا منها ليكون الكود صحيحًا؟