enum (مرجع #C)

يتم استخدام الكلمة الأساسية enum للتصريح عن قائمة تعداد، نوع متميز يتكون من مجموعة من ثوابت مسماة تسمى قائمة العداد.

عادةً يكون من الأفضل تعريف enum مباشرة داخل مساحة الاسم بحيث تكون جميع الفئات في مساحة الاسم قادرة على الوصول إليها بملاءمة متساوية. ومع ذلك، يمكن للـ enum أيضاً أن يكون متداخلاً في الفئة أو البنية.

افتراضياً، العدّاد الأول يكون له قيمة 0 وقيمة كل عداد متتابع يزيد بمقدار 1. فعلى سبيل المثال:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

في قائمة التعداد هذه, Sat هو 0 و Sun هو 1 و Mon هو 2 وهكذا. العدادات لها مُهيآت لتجاوز القيم الافتراضية. فعلى سبيل المثال:

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

في قائمة التعداد هذه، يتم اجبار سلسلة العناصر في بدء التشغيل من 1 بدلاً من 0. على الرغم من ذلك، نوصي بشدة بأن يحتوي الـ enum على ثابت ويحتوي على القيمة 0. لمزيد من المعلومات، راجع أنواع قائمة التعداد (إرشادات برمجة C#).

كل نوع قائمة تعداد لديها نوع أساسي ويمكن أن يكون أي نوع أساسي ماعدا char. النوع الأساسي الافتراضي لعناصر قائمة التعداد هو int. للتصريح عن enum بنوع أساسي آخر مثل byte استخدم نقطتين بعد المعرّف متبوعاً بالنوع:

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

الأنواع المقبولة للـ enum هي byte أو sbyte؛ أو short أو ushort أو int أو uint أو long أو ulong.

يمكن تعيين لأي متغير من نوع Days أي قيمة في نطاق النوع الأساسي; القيم غير محدودة بالثوابت المسماة.

القيمة الافتراضية لـ enum E هي القيمة الناتجة من التعبير (E)0.

ملاحظة

لا يمكن للعداد أن يحتوي على مسافة بيضاء في اسمه.

يحدد النوع الأساسي سعة التخزين المخصصة لكل عداد. على الرغم من ذلك، يجب استخدام تحويل (cast) استخدام صريح للتحويل من نوع enum إلى نوع أساسي. على سبيل المثال، تعين العبارة التالية العداد Sun إلى متغير من نوع int باستخدام تحويل (cast) للتحويل من enum إلى int:

int x = (int)Days.Sun;

عند تطبيق System.FlagsAttribute على قائمة تعداد تحتوي على بعض العناصر مع عامل التشغيل OR المختص بالبت ستلاحظ أن السمة تؤثر على سلوك الـ enum عند استخدامه مع بعض الأدوات. يمكنك ملاحظة هذه التغييرات عند استخدامك لأدوات مثل أساليب فئة Console ومقيمات التعبير وهكذا. (راجع مثال 3).

البرمجة الفعالة

تماماً كما مع أي ثابت جميع مراجع القيم المفردة لـ enum يتم تحويلها إلى قيم حرفية رقمية في وقت التحويل البرمجي. يمكن أن ينشئ هذا مشاكل المحتملة في تعيين الإصدار كما هو موضح في الثوابت ( ارشادات البرمجة C# ).

تعيين قيم إضافية إلى إصدارات جديدة من enum أو تغيير قيم أعضاء enum في إصدارات جديدة يؤدي إلى حدوث مشكلات بالنسبة للتعليمات البرمجية ذات الاعتمادية الكبيرة. تستخدم قيم التعداد غالباً في عبارات switch. إذا تمت إضافة عناصر إضافية إلى نوع enum يمكن لاختبار القيم الافتراضية أن يرجع true بشكل غير متوقع.

إذا كان هناك مطورين آخرين سيستخدمون تعليماتك البرمجية يجب أن تقوم بتوفير إرشادات حول كيفية تعامل تعليماتهم البرمجية إذا تم إضافة عناصر جديدة إلى أنواع enum.

مثال

في هذا المثال، تم تعريف قائمة تعداد Days. تم تحويل عدادين اثنين إلى عددين صحيحين بوضوح وتم تعيين متغيرين من نوع أعداد صحيحة اليهما.


    public class EnumTest
    {
        enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

        static void Main()
        {
            int x = (int)Days.Sun;
            int y = (int)Days.Fri;
            Console.WriteLine("Sun = {0}", x);
            Console.WriteLine("Fri = {0}", y);
        }
    }
    /* Output:
       Sun = 0
       Fri = 5
    */

في هذا المثال، يتم استخدام خيار نوع الأساس للتصريح عن enum ذو أعضاء من نوع long. لاحظ أنه بالرغم من أن النوع الأساسي للتعداد هو long يجب تحويل أعضاء التعداد إلى نوع long باستخدام cast.

    public class EnumTest2
    {
        enum Range : long { Max = 2147483648L, Min = 255L };
        static void Main()
        {
            long x = (long)Range.Max;
            long y = (long)Range.Min;
            Console.WriteLine("Max = {0}", x);
            Console.WriteLine("Min = {0}", y);
        }
    }
    /* Output:
       Max = 2147483648
       Min = 255
    */

يوضح مثال التعليمات البرمجية التالي استخدام وتأثير السمة System.FlagsAttribute على تعريف enum.

    [Flags]
    public enum CarOptions
    {
        SunRoof = 0x01,
        Spoiler = 0x02,
        FogLights = 0x04,
        TintedWindows = 0x08,
    }

    class FlagTest
    {
        static void Main()
        {
            CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
            Console.WriteLine(options);
            Console.WriteLine((int)options);
        }
    }
    /* Output:
       SunRoof, FogLights
       5
    */

التعليقات

ولاحظ أنه إذا قمت بإزالة FlagsAttribute سيتم إخراج التالي من المثال:

5

5

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

راجع أيضًا:

المرجع

الكلمات الأساسية لـ #C

جدول الأنواع المتكاملة (مرجع C#)

جدول الأنواع المضمنة (مرجع C#)

جدول التحويلات الرقمية الواضحة (مرجع #C)

جدول التحويلات الرقمية الواضحة (مرجع #C)

المبادئ

أنواع قائمة التعداد (إرشادات برمجة C#)

تصميم التعداد

موارد أخرى

مرجع C#‎