تُعدّ القوائم التعدادية (Enums) أداة قيّمة في C# لتحديد مجموعات من الثوابت المسماة. وغالباً ما ستحتاج إلى تحويل قيمة صحيحة إلى عضو القائمة التعدادية المقابل. تتناول هذه المقالة عدة تقنيات لأداء هذا التحويل بأمان وفعالية، مع التركيز على أفضل الممارسات.
محتويات
الصب المباشر
أبسط طريقة هي الصب المباشر. يعمل هذا فقط إذا كنت متأكداً من أن الرقم الصحيح يمثل عضواً صالحاً في القائمة التعدادية. ومع ذلك، فهو عرضة للأخطاء وقد يؤدي إلى استثناءات وقت التشغيل إذا كان الرقم الصحيح غير صالح.
public enum DaysOfWeek
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7
}
public class Example
{
public static void Main(string[] args)
{
int dayValue = 3;
DaysOfWeek day = (DaysOfWeek)dayValue;
Console.WriteLine(day); // مخرجات: Wednesday
// هذا سيُلقي باستثناء وقت التشغيل إذا لم تكن dayValue عضواً صالحاً في القائمة التعدادية.
int invalidDayValue = 10;
DaysOfWeek invalidDay = (DaysOfWeek)invalidDayValue;
Console.WriteLine(invalidDay);
}
}
تجنب الصب المباشر ما لم تكن متأكداً تماماً من صحة الرقم الصحيح. إن عدم وجود معالجة للأخطاء يجعله محفوفاً بالمخاطر في التعليمات البرمجية الإنتاجية.
استخدام Enum.Parse
يوفر Enum.Parse
حلاً أكثر قوة. يأخذ نوع القائمة التعدادية و التمثيل النصي للعدد الصحيح كمدخلات، ويعيد عضو القائمة التعدادية المقابل. يُلقي باستثناء ArgumentException
إذا لم تكن القيمة الصحيحة قيمة قائمة تعدادية مُعرّفة.
public class Example
{
public static void Main(string[] args)
{
int dayValue = 3;
try
{
DaysOfWeek day = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), dayValue.ToString());
Console.WriteLine(day); // مخرجات: Wednesday
}
catch (ArgumentException)
{
Console.WriteLine("قيمة قائمة تعدادية غير صالحة.");
}
}
}
Enum.Parse
أكثر أماناً من الصب المباشر لأنه يعالج المدخلات غير الصالحة بشكل صريح، مما يمنع الانهيارات غير المتوقعة. ومع ذلك، فإن معالجة الاستثناءات تضيف عبئاً إضافياً.
استخدام Enum.IsDefined
لتحسين الكفاءة والأمان، تحقق من وجود الرقم الصحيح ضمن القائمة التعدادية باستخدام Enum.IsDefined
قبل استدعاء Enum.Parse
.
public class Example
{
public static void Main(string[] args)
{
int dayValue = 3;
if (Enum.IsDefined(typeof(DaysOfWeek), dayValue))
{
DaysOfWeek day = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), dayValue.ToString());
Console.WriteLine(day); // مخرجات: Wednesday
}
else
{
Console.WriteLine("قيمة قائمة تعدادية غير صالحة.");
}
}
}
يُجمع هذا بين أمان Enum.Parse
وفحص الصلاحية الأولي، مما يقلل من فرصة حدوث استثناءات.
استخدام Enum.TryParse
Enum.TryParse
هو النهج المُوصى به. يحاول التحويل، ويعيد قيمة منطقية تشير إلى النجاح أو الفشل دون إلقاء استثناءات. هذا يجعل معالجة الأخطاء أنظف وأكثر كفاءة.
public class Example
{
public static void Main(string[] args)
{
int dayValue = 3;
DaysOfWeek day;
if (Enum.TryParse(dayValue.ToString(), out day))
{
Console.WriteLine(day); // مخرجات: Wednesday
}
else
{
Console.WriteLine("قيمة قائمة تعدادية غير صالحة.");
}
}
}
Enum.TryParse
هي الطريقة الأكثر قوة والأفضل تفضيلاً نظرًا لمعالجة الأخطاء الخالية من الاستثناءات وكفاءتها.
الخاتمة
توجد طرق متعددة لتحويل الأعداد الصحيحة إلى قوائم تعدادية في C#. بينما يُعد الصب المباشر مُوجزاً، إلا أنه الأقل أماناً. يوفر Enum.Parse
معالجة قائمة على الاستثناءات، ويضيف Enum.IsDefined
فحصاً وقائياً. ومع ذلك، فإن Enum.TryParse
يبرز كحل أكثر قوة وكفاءة، حيث يوفر معالجة أخطاء نظيفة خالية من الاستثناءات. اختر الطريقة التي تناسب سياقك بشكل أفضل، مع إعطاء الأولوية دائماً للأمان والصيانة. تعامل مع الأخطاء المحتملة بشكل سلس لمنع سلوك التطبيق غير المتوقع.