تخطَّ إلى المحتوى

الشروط في C#‎: if و switch

الدرس 3 من 11 · C#

في لعبة Unity، كل إطار يسأل البرنامج عشرات الأسئلة: هل لمس اللاعب العدو؟ هل انتهت الذخيرة؟ هل وصل لنقطة النهاية؟ وفي تطبيق بنكي: هل الرصيد كافٍ؟ هل كلمة المرور صحيحة؟ كل هذه قرارات تُكتب بالشروط. في هذا الدرس ستتعلمها في C#‎، ومعها تعبير switch الحديث الذي يجعل القرارات المعقدة قصيرة وواضحة.

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)، وهذا يحميك من أخطاء صامتة شهيرة.

string password = "1234";
if (password == "1234")
{
Console.WriteLine("كلمة المرور صحيحة");
}
الناتج
كلمة المرور صحيحة

في C#‎، == مع النصوص تقارن المحتوى مباشرة، فلا داعي لـ equals كما في Java. ولتجاهل الفرق بين الأحرف الكبيرة والصغيرة: string.Equals(a, b, StringComparison.OrdinalIgnoreCase).

int stock = 0;
string status = stock > 0 ? "متوفر" : "غير متوفر";
Console.WriteLine(status);
الناتج
غير متوفر

عندما تقارن قيمة واحدة بعدة احتمالات، يوفر 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 مثل آلة فرز الفواكه حسب الحجم: كل حبة تمر على الفتحات بالترتيب، وتسقط في أول فتحة تناسبها.

ستجد أيضاً الصيغة الأقدم، وما زالت مفيدة عندما تريد تنفيذ عدة أوامر لا إرجاع قيمة:

int month = 2;
switch (month)
{
case 12:
case 1:
case 2:
Console.WriteLine("الشتاء");
break;
default:
Console.WriteLine("فصل آخر");
break;
}
الناتج
الشتاء
  • عدة case متتالية بلا كود بينها تشترك في نفس الكود.
  • كل حالة فيها كود يجب أن تنتهي بـ break. وعلى عكس C و C++‎، إذا نسيتها يرفض المترجم الكود ولا ينزلق التنفيذ للحالة التالية بصمت. C#‎ تحميك من هذا الفخ!

اكتب برنامجاً لحساب سعر تذكرة سينما:

  1. متغير age ومتغير day (اسم اليوم).
  2. بتعبير switch على العمر: أقل من 12 سعرها 30، ومن 12 إلى 59 سعرها 60، و 60 فأكثر سعرها 40.
  3. بـ if: إذا كان اليوم «الثلاثاء» اخصم 20% من السعر.
  4. اطبع: «سعر التذكرة: … جنيه».

تحدٍّ: آلة حاسبة بتعبير switch على حرف العملية op، تُرجع النتيجة، أو double.NaN للعملية غير المعروفة.

  • نسيان break في switch التقليدي: خطأ ترجمة في C#‎، وهذا جيد.
  • نسيان الفاصلة المنقوطة بعد تعبير switch: }; في آخره مطلوبة لأنه جزء من جملة الإسناد.
  • ترتيب الأنماط: في grade switch، إذا كتبت >= 75 قبل >= 90، فلن يصل أحد إلى «A»، والمترجم سينبهك أن الفرع لن يُنفَّذ أبداً.

سؤال

ما معنى الشرطة السفلية _ في تعبير switch في C#‎؟

سؤال

ماذا يحدث في C#‎ إذا نسيت break في نهاية حالة فيها كود داخل switch التقليدي؟

  • if و else if و else للقرارات، والشرط يجب أن يكون bool.
  • == تقارن محتوى النصوص في C#‎ مباشرة.
  • المعامل الثلاثي لاختيار قيمة في سطر واحد.
  • تعبير switch الحديث x switch { نمط => قيمة, _ => ... } يقبل or والمقارنات.
  • switch التقليدي يحتاج break إجبارياً، ولا يسمح بالانزلاق الصامت.