الشروط في C#: if و switch
في لعبة Unity، كل إطار يسأل البرنامج عشرات الأسئلة: هل لمس اللاعب العدو؟ هل انتهت الذخيرة؟ هل وصل لنقطة النهاية؟ وفي تطبيق بنكي: هل الرصيد كافٍ؟ هل كلمة المرور صحيحة؟ كل هذه قرارات تُكتب بالشروط. في هذا الدرس ستتعلمها في C#، ومعها تعبير switch الحديث الذي يجعل القرارات المعقدة قصيرة وواضحة.
if و else
Section titled “if و else”int score = 72;
if (score >= 90){ Console.WriteLine("ممتاز");}else if (score >= 50){ Console.WriteLine("ناجح");}else{ Console.WriteLine("راسب");}ناجحC# تفحص من الأعلى، وتنفّذ أول فرع صحيح فقط. ولاحظ أسلوب C# المعتاد: القوس المعقوف { في سطر مستقل، على عكس Java و JavaScript.
عوامل المقارنة: == و != و > و < و >= و <=.
العوامل المنطقية: && (و)، و || (أو)، و ! (ليس):
int age = 16;bool hasTicket = true;if (age >= 13 && hasTicket){ Console.WriteLine("تفضل بالدخول");}تفضل بالدخولوالشرط في C# يجب أن يكون bool حرفياً. if (5) مقبولة في C، لكنها خطأ ترجمة في C#، وكذلك if (x = 5)، وهذا يحميك من أخطاء صامتة شهيرة.
مقارنة النصوص
Section titled “مقارنة النصوص”string password = "1234";if (password == "1234"){ Console.WriteLine("كلمة المرور صحيحة");}كلمة المرور صحيحةفي C#، == مع النصوص تقارن المحتوى مباشرة، فلا داعي لـ equals كما في Java. ولتجاهل الفرق بين الأحرف الكبيرة والصغيرة: string.Equals(a, b, StringComparison.OrdinalIgnoreCase).
المعامل الثلاثي
Section titled “المعامل الثلاثي”int stock = 0;string status = stock > 0 ? "متوفر" : "غير متوفر";Console.WriteLine(status);غير متوفرتعبير switch الحديث
Section titled “تعبير switch الحديث”عندما تقارن قيمة واحدة بعدة احتمالات، يوفر C# تعبير switch الذي يُرجع قيمة:
string day = "الجمعة";string message = day switch{ "الجمعة" or "السبت" => "عطلة نهاية الأسبوع", "الأحد" => "أول أيام الدراسة", _ => "يوم دراسي عادي"};Console.WriteLine(message);عطلة نهاية الأسبوع- المتغير يأتي قبل كلمة
switch. - كل فرع: نمط ثم
=>ثم النتيجة، والفروع بينها فواصل. orتجمع عدة قيم في فرع واحد.- الشرطة السفلية
_تعني «أي قيمة أخرى»، مثلelse.
والأنماط يمكن أن تكون مقارنات:
int grade = 85;string label = grade switch{ >= 90 => "A", >= 75 => "B", _ => "C"};Console.WriteLine(label);Bتخيّل تعبير switch مثل آلة فرز الفواكه حسب الحجم: كل حبة تمر على الفتحات بالترتيب، وتسقط في أول فتحة تناسبها.
جملة switch التقليدية
Section titled “جملة switch التقليدية”ستجد أيضاً الصيغة الأقدم، وما زالت مفيدة عندما تريد تنفيذ عدة أوامر لا إرجاع قيمة:
int month = 2;switch (month){ case 12: case 1: case 2: Console.WriteLine("الشتاء"); break; default: Console.WriteLine("فصل آخر"); break;}الشتاء- عدة
caseمتتالية بلا كود بينها تشترك في نفس الكود. - كل حالة فيها كود يجب أن تنتهي بـ
break. وعلى عكس C و C++، إذا نسيتها يرفض المترجم الكود ولا ينزلق التنفيذ للحالة التالية بصمت. C# تحميك من هذا الفخ!
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب برنامجاً لحساب سعر تذكرة سينما:
- متغير
ageومتغيرday(اسم اليوم). - بتعبير switch على العمر: أقل من 12 سعرها 30، ومن 12 إلى 59 سعرها 60، و 60 فأكثر سعرها 40.
- بـ
if: إذا كان اليوم «الثلاثاء» اخصم 20% من السعر. - اطبع: «سعر التذكرة: … جنيه».
تحدٍّ: آلة حاسبة بتعبير switch على حرف العملية op، تُرجع النتيجة، أو double.NaN للعملية غير المعروفة.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان break في switch التقليدي: خطأ ترجمة في C#، وهذا جيد.
- نسيان الفاصلة المنقوطة بعد تعبير switch:
};في آخره مطلوبة لأنه جزء من جملة الإسناد. - ترتيب الأنماط: في
grade switch، إذا كتبت>= 75قبل>= 90، فلن يصل أحد إلى «A»، والمترجم سينبهك أن الفرع لن يُنفَّذ أبداً.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما معنى الشرطة السفلية _ في تعبير switch في C#؟
_ نمط يطابق كل شيء، فيُستخدم كحالة افتراضية مثل else و default.
سؤال
ماذا يحدث في C# إذا نسيت break في نهاية حالة فيها كود داخل switch التقليدي؟
C# لا تسمح بالانزلاق الضمني، فيرفض المترجم الكود حتى تضيف break.
الخلاصة
Section titled “الخلاصة”ifوelse ifوelseللقرارات، والشرط يجب أن يكونbool.==تقارن محتوى النصوص في C# مباشرة.- المعامل الثلاثي لاختيار قيمة في سطر واحد.
- تعبير switch الحديث
x switch { نمط => قيمة, _ => ... }يقبلorوالمقارنات. - switch التقليدي يحتاج
breakإجبارياً، ولا يسمح بالانزلاق الصامت.