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

نوع قائمة التعداد (تسمى أيضاً قائمة التعداد أو enum) يوفر طريقة فعالة لتعريف مجموعة من الثوابت المتكاملة المسماة التي يمكن تعيينها إلى متغير. على سبيل المثال، افترض أنه عليك تعريف متغير له قيمة لتمثيل يوم من أيام الأسبوع. لا يوجد سوى سبع قيم ذات معنى هذا المتغير الذي سيتم تخزينه أي وقت مضى. لتعريف هذه القيم, يمكنك استخدام نوع قائمة التعداد الذي تم تعريفه عن طريق استخدام الكلمة الأساسية قائمة التعداد.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

بشكل افتراضي النوع الأساسي لكل عنصر في التعداد هو عدد صحيح. يمكنك تحديد نوع رقمي أساسي آخر باستخدام فاصلة منقوطة، كما هو موضح في المثال السابق. للحصول على قائمة كاملة للأنواع المحتملة راجع التعداد (مرجع C#).

فيما يلي ميزات استخدام التعداد بدلاً من نوع عددي:

  • أنت تحدد بوضوح للتعليمات البرمجية للعميل القيم التي تصلح للمتغير.

  • في Visual Studio، يسرد التحسس الذكي "IntelliSense" القيم المعرفة.

عندما لا يتم تحديد القيم للعناصر في قائمة العداد، فإنه يتم تلقائياً تعيين القيم إلى 1. في المثال السابق، Days.Sunday يحتوي على القيمة 0, Days.Monday يحتوي على القيمة 1 وهكذا. عندما تقوم بإنشاء كائن جديد Days فإنه سيكون قيمة افتراضية Days.Sunday (0) إذا لم تقم بوضوح بتعيين القيمة. عند إنشاء التعداد, قم بتحديد القيمة الافتراضية الأكثر منطقيةوإعطاءها قيمة صفر. سيؤدي ذلك إلى تضمن كل التعدادات لقيمة افتراضية إذا لم يتم تعيين القيمة بوضوح عند إنشاءها.

إذا كان المتغير meetingDay من نوع Days، ثم (بدون تحويل صريح) يمكن فقط تعيين أحد القيم التي تم تعريفها من قِبل Days. إذا تم تغيير يوم الاجتماع فيمكن تعيين قيمة جديدة من Days إلى meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

ملاحظة

من الممكن تعيين أية قيمة عدد صحيح إجبارية إلى meetingDay. على سبيل المثال، لا ينتج هذا السطر من التعليمة البرمجية خطأ: meetingDay = (Days) 42. وعلى الرغم من ذلك، ينبغي عدم القيام بذلك لأن التوقع الضمني أن متغير التعداد سيحتوي فقط على واحدة من القيم التي تم تعريفها بالتعداد. لتعيين القيمة عشوائية إلى متغير من نوع قائمة التعداد لتقديم مخاطرة عالية للأخطاء.

يمكنك تعيين أي قيم للعناصر الموجودة في قائمة العداد لنوع التعداد، ويمكنك أيضا استخدام القيم المحسوبة:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

أنواع قائمة التعداد كعلامات بت

يمكنك استخدام نوع تعداد لتعريف علامات بت، والذي يمكّن مثيل من نوع التعداد لتخزين أية تركيبة من القيم التي تم تعريفها في قائمة التعداد. (بالطبع، بعض مجموعات قد لا تكون ذات معنى أو مسموح بها في التعليمات البرمجية للبرنامج.)

إنشاء إشارات تعداد بت بتطبيق السمة System.FlagsAttribute وتعريف القيم بشكل مناسب حتى AND, OR, NOT و XOR يمكن تنفيذ عمليات البت عليها. في تعداد علامات بت، وتشمل الثابت المسمى بقيمة صفر يعني "لم يتم تعيين أي إشارات." لا تعطي علامة لقيمة صفر إذا كان لا يعني " لم يتم تعيين علامات".

في المثال التالي, إصدار آخر من تعداد Days المسمى Days2، تم تعريفه. Days2 يحتوي على سمة Flags و كل قيمة تعين التالي إلى قوة أكبر من 2. يتيح لك ذلك إلى إنشاء متغير Days2 قيمته Days2.Tuesday و Days2.Thursday.

    [Flags]
    enum Days2
    {
        None = 0x0,
        Sunday = 0x1,
        Monday = 0x2,
        Tuesday = 0x4,
        Wednesday = 0x8,
        Thursday = 0x10,
        Friday = 0x20,
        Saturday = 0x40
    }
    class MyClass
    {
        Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
    }

لتعيين علامة في التعداد, استخدم عامل التشغيل المختص بالبتOR كما هو موضح في المثال التالي:

// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

لتحديد ما إذا تم تعيين علامة معينة, استخدم عامل التشغيل المختص بالب AND, كما هو موضح في المثال التالي:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

للحصول على معلومات أكثر حول ما يجب مراعاته عند تعريف أنواع التعداد مع السمات System.FlagsAttribute , راجع System.Enum.

استخدام أساليب نظام.التعداد لاستكشاف والتحكم في قيم التعداد

كل التعدادات عبارة عن مثيلات من نوع System.Enum. لا يمكن اشتقاق فئات جديدة من System.Enum، ولكن يمكنك استخدام الأساليب الخاصة به لاكتشاف معلومات حول القيم في مثيل التعداد ومعالجتها.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

لمزيد من المعلومات، راجع System.Enum.

يمكنك أيضاً إنشاء أسلوب جديد للتعداد باستخدام أسلوب التوسيع. لمزيد من المعلومات، راجع كيفية القيام بما يلي: إنشاء أسلوب جديد قائمة تعداد (البرمجة C# إرشادات).

راجع أيضًا:

المرجع

enum (مرجع #C)

System.Enum

المبادئ

دليل البرمجة لـ #C