مقدمة: لماذا enum بدون int مثل القهوة بدون كافيين؟
\n\nتخيل الموقف: أنت تكتب كودًا رائعًا بلغة C#، وتستخدم التعدادات (enum) لتخزين حالات الطلب، أيام الأسبوع، أو مستويات الصلاحية. كل شيء جميل وسهل القراءة. ولكن فجأة تأتي مهمة: حفظ هذه القيمة في قاعدة بيانات، إرسالها عبر HTTP API، أو مجرد طباعتها في السجل. وهنا تصطدم بجدار — يجب تحويل enum إلى int.
هذه ليست مجرد "أمنية" من كتاب مدرسي. وفقًا لإحصائيات Stack Overflow، فإن سؤال "Get int value from enum in C#" يجمع مئات الآلاف من المشاهدات. حتى المطورون ذوو الخبرة أحيانًا يختلط عليهم الأمر: تحويل مباشر؟ Convert.ToInt32؟ وماذا لو كان نوع العدد الصحيح الأساسي ليس int؟
في هذه المقالة، سنستعرض جميع الطرق القانونية للحصول على قيمة عدد صحيح من enum في C#. بدءًا من التحويل البسيط للأنواع وصولاً إلى الحيل المتقدمة مع Unsafe.As (نعم، هذا موجود أيضًا!). ستتعرف على أي طريقة أسرع، وأيها أكثر أمانًا، وأيها من الأفضل عدم استخدامه في بيئة الإنتاج.
1. كيف يعمل enum في C#: نبذة مختصرة
\n\nقبل التحويل، دعنا نتذكر الأساسيات. في C#، enum هو نوع قيم (value type) يرث من System.Enum، ونوعه الأساسي (underlying type) الافتراضي هو int. ولكن يمكنك تحديد نوع آخر صراحة:
public enum Status : byte\n{\n New = 0,\n Active = 1,\n Closed = 2\n}\n\npublic enum Priority : long\n{\n Low = 10,\n Medium = 50,\n High = 100\n}\n\nهذا مهم! إذا كان enum الخاص بك يستخدم byte أو long، فإن التحويل البسيط إلى int قد يؤدي إلى خطأ أو فقدان بيانات.
2. الطريقة رقم 1: التحويل الصريح (cast) — الكلاسيكي
\n\nالطريقة الأكثر وضوحًا وسرعة هي استخدام عامل تحويل النوع. تعمل عندما تعرف بالتأكيد أن النوع الأساسي هو int.
enum Day { Monday = 1, Tuesday = 2, Wednesday = 3 }\n\nDay today = Day.Tuesday;\nint dayValue = (int)today; // النتيجة: 2\n\nConsole.WriteLine(dayValue); // سيطبع: 2\n\nالمزايا:
\n- \n
- أقصى أداء — المترجم يولد تعليمة IL واحدة. \n
- بساطة وسهولة القراءة. \n
العيوب:
\n- \n
- إذا كان النوع الأساسي ليس
int، سيصدر المترجم خطأ أو تحذيرًا. \n - لا يعمل مع
enumالمعرفة بـlongأوbyte(يتطلب تحويلًا مزدوجًا). \n
متى تستخدم: في 90% من الحالات عندما يكون enum الخاص بك قياسيًا (: int).
3. الطريقة رقم 2: Convert.ToInt32 — الجندي العالمي
\n\nطريقة Convert.ToInt32() هي سكين سويسري للتحويل. تستقبل object وتحاول تحويله إلى int عبر واجهة IConvertible.
enum Status { New = 0, Active = 1, Closed = 2 }\n\nStatus current = Status.Active;\nint statusCode = Convert.ToInt32(current); // النتيجة: 1\n\nConsole.WriteLine(statusCode); // 1\n\nالمزايا:
\n- \n
- تعمل مع أي نوع أساسي (
byte,short,long، إلخ). \n - لا تتطلب معرفة صريحة بنوع enum. \n
العيوب:
\n- \n
- أبطأ من التحويل المباشر (استدعاء دالة افتراضية). \n
- قد ترمي
InvalidCastExceptionإذا مررت شيئًا ليس enum. \n
متى تستخدم: عندما تكتب كودًا عامًا أو تعمل مع enum لا تعرف نوعه الأساسي في وقت الترجمة.
\n\n4. الطريقة رقم 3: GetHashCode() — خدعة خطيرة (لا تفعل هذا!)
\n\nعلى الإنترنت، قد تجد نصيحة "عبقرية": استخدام GetHashCode(). نعم، تقنيًا هو