C# التعداد (التعداد) مع مثال

⚡ ملخص ذكي

تُعرّف التعدادات في لغة C# مجموعةً مُسمّاةً من القيم العددية الثابتة، مثل أيام الأسبوع، مما يُسهّل قراءة الكود وصيانته. تُصرّح الكلمة المفتاحية enum عن هذه الثوابت الثابتة مرةً واحدةً لإعادة استخدامها في جميع أنحاء البرنامج.

  • 📐 فريف: تجمع الكلمة المفتاحية enum الثوابت المسماة ذات الصلة تحت نوع واحد، مما يؤدي إلى استبدال الأرقام السحرية المتناثرة بمعرفات قابلة للقراءة.
  • 🗓️ مثال على الأيام: يقوم تعداد يسمى Days بتخزين أيام الأسبوع، ويعيد Days.Sun العضو المحدد باسمه.
  • 🔢 القيم الأساسية: ترتبط عناصر التعداد بقيم عددية صحيحة تبدأ من الصفر وتزداد بمقدار واحد ما لم يتم تعيين أرقام مخصصة.
  • 🔁 التحويلات: تقوم عمليات التحويل الصريحة بتحويل نوع التعداد إلى عدد صحيح، بينما تقوم Enum.Parse و Enum.TryParse بتحويل النص مرة أخرى إلى أعضاء.
  • 🚩 الأعلام: تتيح سمة Flags لعنصر تعدادي واحد دمج عدة خيارات كحقول بت باستخدام عامل التشغيل OR على مستوى البت.
  • 🤖 مساعدة الذكاء الاصطناعي: يساعد GitHub Copilot و ML.NET في إنشاء تعريفات التعداد وربط التعدادات بميزات التعلم الآلي.

C# Enum(Enumeration)

التعداد C#

يتم استخدام التعداد في أي لغة برمجة لتحديد مجموعة ثابتة من القيم. على سبيل المثال، يمكن تعريف أيام الأسبوع على أنها تعداد واستخدامها في أي مكان في البرنامج. في C#، يتم تعريف التعداد بمساعدة الكلمة الأساسية "التعداد".

دعونا نرى مثالاً لكيفية استخدام الكلمة الأساسية "enum".

في مثالنا، سنحدد تعدادًا يسمى الأيام، والذي سيتم استخدامه لتخزين أيام الأسبوع. لكل مثال، سنقوم بتعديل الوظيفة الرئيسية فقط في ملف Program.cs الخاص بنا.

التعداد C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program 
 {
  enum Days{Sun,Mon,tue,Wed,thu,Fri,Sat};
  
  static void Main(string[] args) 
  {
   Console.Write(Days.Sun);
   
   Console.ReadKey();
  }
 }
}

Code تفسير:-

  1. "التعداد" نوع البيانات تم تحديده للإعلان عن التعداد. اسم التعداد هو أيام. يتم تحديد كافة أيام الأسبوع كقيم التعداد.
  2. وأخيرًا، يتم استخدام الدالة console.write لعرض إحدى قيم التعداد.

إذا تم إدخال الكود أعلاه بشكل صحيح وتم تنفيذ البرنامج بنجاح، سيتم عرض الإخراج التالي.

الإخراج:

التعداد C#

من المخرجات، يمكنك أن ترى أن قيمة "Sun" للعدد معروضة في وحدة التحكم.

لماذا نستخدم التعدادات في لغة C#؟

تُسهّل التعدادات قراءة البرنامج، وتجعله أكثر أمانًا، وأبسط في الصيانة. فبدلاً من نثر أرقام غير مُفسّرة، تُسمى أحيانًا بالأرقام السحرية، في جميع أنحاء الكود، يُعطي التعداد لكل قيمة اسمًا وصفيًا يُبيّن الغرض منها.

  • قراءة: إن اسمًا مثل Days.Fri أكثر وضوحًا بكثير من الرقم 5، لذلك فإن أي شخص يقرأ الشفرة يفهم المعنى على الفور.
  • أمان النوع: لا يمكن للمتغير المُعلن عنه بنوع تعدادي أن يحتوي إلا على عضو واحد من الأعضاء المُعرّفة، مما يمنع تسرب القيم غير الصالحة.ping في.
  • قابلية الصيانة: توجد الثوابت ذات الصلة في مكان واحد، لذا فإن إضافة قيمة أو إعادة تسميتها تُحدّث البرنامج بأكمله بشكل متسق.
  • ربط البيانات: يمكن لأطر العمل مثل WPF و ASP.NET ربط تعداد بقائمة منسدلة، مما يجعل التعدادات مفيدة لبناء واجهات المستخدم.

لأن المترجم يتحقق من كل عملية إسناد مقابل الأعضاء المسموح بها، فإن التعدادات تساعد أيضًا في اكتشاف الأخطاء مبكرًا، قبل تشغيل البرنامج.

تعيين قيم مخصصة لنوع بيانات تعدادي في لغة C#

افتراضيًا، تُعيّن لغة C# القيمة 0 لأول عنصر في التعداد، ثم تزيد قيمة كل عنصر لاحق بمقدار واحد. في تعداد الأيام المذكور أعلاه، قيمة الأحد تساوي 0، وقيمة الاثنين تساوي 1، وقيمة السبت تساوي 6. يمكنك تجاوز هذه القيم الافتراضية بتعيين أرقام صريحة.

  • القيم الصريحة: كتابة enum Level {Low = 1, Medium = 5, High = 10} تحدد لكل عضو رقمًا مختارًا بدلاً من التسلسل الافتراضي.
  • مهمة جزئية: إذا قمت بتعيين قيمة لبعض الأعضاء فقط، فإن المترجم يستمر في الترقيم من آخر قيمة تم تعيينها للأعضاء التالية.
  • النوع الأساسي: يقوم نظام التعداد بتخزين أعضائه كأعداد صحيحة افتراضيًا، ولكن يمكنك الاعتماد على البايت أو الأعداد القصيرة أو الطويلة لتوفير الذاكرة أو توسيع النطاق.

تُعد القيم المخصصة مفيدة عندما يجب أن تتطابق الأرقام مع نظام خارجي، مثل رموز قواعد البيانات أو ثوابت البروتوكول، بحيث يعكس التعداد البيانات الحقيقية تمامًا.

كيفية تحويل قيم التعداد في لغة C# إلى أعداد صحيحة وسلاسل نصية وعلامات (Flags)

تحتاج لغة C# في كثير من الأحيان إلى تحويل قيمة من نوع enum إلى شكل آخر، مثل تخزينها كرقم أو قراءتها من نص. تتم هذه التحويلات بعدة طرق قياسية.

  • تحويل القيم العددية إلى أعداد صحيحة: يؤدي التحويل الصريح مثل (int)Days.Wed إلى إرجاع العدد الصحيح الأساسي، وهو أمر مفيد للتخزين أو العمليات الحسابية.
  • تحويل عدد صحيح إلى تعداد: التحويل في الاتجاه المعاكس، على سبيل المثال (أيام)3، يحول الرقم مرة أخرى إلى عضو التعداد المطابق.
  • تحويل السلسلة إلى تعداد: تقوم الدالة Enum.Parse والدالة الأكثر أمانًا Enum.TryParse بتحويل اسم مثل "Fri" إلى عضو Days.Fri دون طرح خطأ عند وجود نص غير صالح.
  • تحويل القيم العددية إلى سلسلة نصية: يؤدي استدعاء ToString على أي عضو إلى إرجاع اسمه، لذا فإن Days.Sun.ToString() ينتج "Sun" للعرض أو التسجيل.
  • قائمة الأعضاء: تقوم Enum.GetValues ​​و Enum.GetNames بإرجاع كل قيمة أو اسم، مما يساعد عند ملء القوائم أو التحقق من صحة الإدخال.

عندما يجب أن يمثل التعداد مجموعة من الخيارات بدلاً من خيار واحد، قم بتطبيق سمة Flags وأعطِ كل عنصر قوة من قوى العدد اثنين، مثل 1 و2 و4 و8. يمكنك بعد ذلك دمج العناصر باستخدام عامل التشغيل OR الثنائي واختبار خيار معين باستخدام طريقة HasFlag.

تتيح تقنيات التحويل هذه نقل التعداد بسلاسة بين الأسماء المقروءة والأرقام المخزنة ومجموعات العلامات المدمجة، مع الحفاظ علىping بقية البرنامج آمنة من حيث الكتابة وسهلة المتابعة.

الأسئلة الشائعة

تكون القيمة الافتراضية لمتغير التعداد هي 0، وهي القيمة التي يتم تعيينها لأي عضو يساوي 0. إذا لم يكن أي عضو يساوي 0، فسيظل المتغير يحمل القيمة 0، لذلك غالبًا ما يقوم المطورون بتعريف عضو None أو Unknown أولاً لتجنب الالتباس.

يُعرّف الثابت قيمةً واحدةً مُسمّاة، بينما يُجمّع التعداد مجموعةً من الثوابت المُسمّاة ذات الصلة تحت نوع واحد. كما يُضيف التعداد أمانًا للأنواع، لأن المتغير لا يمكنه استيعاب سوى عنصر واحد من عناصر التعداد المُعرّفة.

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

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

يُعدّ التعداد نوعًا من أنواع القيم، لذا فهو يخزن بياناته مباشرةً بدلاً من تخزينها كمرجع في الذاكرة الديناميكية. وهو يرث من System.Enum ولكنه يتصرف كنوع عددي أساسي، مما يجعل نسخ قيم التعداد ومقارنتها سريعًا.

نعم. في ML.NET، يمكنك ربط قيمة تعدادية بميزة أو تصنيف فئوي، غالبًا عن طريق تحويلها إلى قيمتها العددية أو ترميزها باستخدام الترميز الأحادي الساخن. تحافظ القيم التعدادية ذات الأنواع المحددة بدقة على وضوح واتساق أعمدة الإدخال في مسار التعلم الآلي.

نعم. يقترح GitHub Copilot تعريفات كاملة للتعدادات، وقيمًا مخصصة، وسمات Flags، ومساعدات تحويل مثل Enum.TryParse داخل Visual Studio و VS Code. Revراجع كل اقتراح، لأن برنامج Copilot قد يختار قيمًا أو أسماءً لا تتناسب مع نطاقك.

استخدم دالة Enum.IsDefined، التي تُرجع القيمة "صحيح" عندما يتطابق رقم أو اسم مُعطى مع عنصر مُعرّف. يُمكّنك استخدامها مع دالة Enum.TryParse من التحقق من صحة مُدخلات المستخدم بأمان قبل تحويل النص إلى قيمة تعدادية.

تلخيص هذه التدوينة بـ: