فحص الأنواع في C#: typeof و GetType() و is — متى نستخدم أيًا منها؟
مرحبًا بالجميع. أنا مطور C# مبتدئ وأخلط دائمًا بين فحوصات الأنواع. هناك ثلاث طرق: `typeof`، وطريقة `GetType()`، وعامل `is`.
على سبيل المثال، لدي هذا الكود:
```csharp
object obj = "Hello";
// الخيار 1
if (obj.GetType() == typeof(string))
Console.WriteLine("هذه سلسلة عبر GetType");
// الخيار 2
if (obj is string)
Console.WriteLine("هذه سلسلة عبر is");
// الخيار 3
Type t = typeof(string);
```
يبدو أن الثلاثة تفحص النوع، لكني ألاحظ سلوكًا غريبًا. عندما أستخدم `is` مع الأنواع القابلة للصفر (nullable types)، يتصرف بشكل مختلف عن `GetType()`. على سبيل المثال:
```csharp
int? x = 5;
if (x is int) // true
Console.WriteLine("x is int");
if (x.GetType() == typeof(int)) // true أيضًا
Console.WriteLine("x.GetType == typeof(int)");
```
لكن إذا كانت x = null، فإن `x is int?` يُرجع false، بينما `GetType()` سيرمي NullReferenceException.
ونقطة أخرى: قرأت أن `typeof` يعمل فقط مع الأنواع في وقت الترجمة (compile time)، بينما `GetType()` يعمل في وقت التشغيل (runtime).