Avatar ·

فحص الأنواع في 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).