تحويل enum إلى int في C#: دليل شامل من المبتدئ إلى المحترف

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا enum بدون int مثل القهوة بدون كافيين؟

\n\n

تخيل الموقف: أنت تكتب كودًا رائعًا بلغة C#، وتستخدم التعدادات (enum) لتخزين حالات الطلب، أيام الأسبوع، أو مستويات الصلاحية. كل شيء جميل وسهل القراءة. ولكن فجأة تأتي مهمة: حفظ هذه القيمة في قاعدة بيانات، إرسالها عبر HTTP API، أو مجرد طباعتها في السجل. وهنا تصطدم بجدار — يجب تحويل enum إلى int.

\n\n

هذه ليست مجرد "أمنية" من كتاب مدرسي. وفقًا لإحصائيات Stack Overflow، فإن سؤال "Get int value from enum in C#" يجمع مئات الآلاف من المشاهدات. حتى المطورون ذوو الخبرة أحيانًا يختلط عليهم الأمر: تحويل مباشر؟ Convert.ToInt32؟ وماذا لو كان نوع العدد الصحيح الأساسي ليس int؟

\n\n

في هذه المقالة، سنستعرض جميع الطرق القانونية للحصول على قيمة عدد صحيح من enum في C#. بدءًا من التحويل البسيط للأنواع وصولاً إلى الحيل المتقدمة مع Unsafe.As (نعم، هذا موجود أيضًا!). ستتعرف على أي طريقة أسرع، وأيها أكثر أمانًا، وأيها من الأفضل عدم استخدامه في بيئة الإنتاج.

\n\n

1. كيف يعمل enum في C#: نبذة مختصرة

\n\n

قبل التحويل، دعنا نتذكر الأساسيات. في C#، enum هو نوع قيم (value type) يرث من System.Enum، ونوعه الأساسي (underlying type) الافتراضي هو int. ولكن يمكنك تحديد نوع آخر صراحة:

\n\n
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 قد يؤدي إلى خطأ أو فقدان بيانات.

\n\n

2. الطريقة رقم 1: التحويل الصريح (cast) — الكلاسيكي

\n\n

الطريقة الأكثر وضوحًا وسرعة هي استخدام عامل تحويل النوع. تعمل عندما تعرف بالتأكيد أن النوع الأساسي هو int.

\n\n
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
    \n
  • إذا كان النوع الأساسي ليس int، سيصدر المترجم خطأ أو تحذيرًا.
  • \n
  • لا يعمل مع enum المعرفة بـ long أو byte (يتطلب تحويلًا مزدوجًا).
  • \n
\n\n

متى تستخدم: في 90% من الحالات عندما يكون enum الخاص بك قياسيًا (: int).

\n\n

3. الطريقة رقم 2: Convert.ToInt32 — الجندي العالمي

\n\n

طريقة Convert.ToInt32() هي سكين سويسري للتحويل. تستقبل object وتحاول تحويله إلى int عبر واجهة IConvertible.

\n\n
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
  • أبطأ من التحويل المباشر (استدعاء دالة افتراضية).
  • \n
  • قد ترمي InvalidCastException إذا مررت شيئًا ليس enum.
  • \n
\n\n

متى تستخدم: عندما تكتب كودًا عامًا أو تعمل مع enum لا تعرف نوعه الأساسي في وقت الترجمة.

\n\n

4. الطريقة رقم 3: GetHashCode() — خدعة خطيرة (لا تفعل هذا!)

\n\n

على الإنترنت، قد تجد نصيحة "عبقرية": استخدام GetHashCode(). نعم، تقنيًا هو

المدونات

توصيات الكتب