C#: الجمل الشرطية
1. عبارة if
تقوم عبارة «if» بتنفيذ كتلة من التعليمات البرمجية بناءً على نتيجة تعبير منطقي. وعندما يكون الشرط صحيحًا، يتم تنفيذ الكتلة؛ أما إذا كان خطأً، فيتم تخطيها.
int score = 85;
if (score >= 60)
{
Console.WriteLine("Passed");
}
Passed
2. عبارة if...else
استخدم عبارة «if...else» لتنفيذ فرع معين عندما تكون الحالة صحيحة، وفرع آخر عندما تكون الحالة خاطئة.
int age = 16;
if (age >= 18)
{
Console.WriteLine("Adult");
}
else
{
Console.WriteLine("Minor");
}
Minor
3. if...else if: الفروع المتعددة
عندما تحتاج إلى التحقق من عدة شروط متنافية، استخدم عبارة «else if» لاختبارها بالترتيب. ولن يتم تنفيذ سوى الفرع الأول المطابق.
int score = 78;
if (score >= 90)
{
Console.WriteLine("Excellent");
}
else if (score >= 80)
{
Console.WriteLine("Good");
}
else if (score >= 60)
{
Console.WriteLine("Pass");
}
else
{
Console.WriteLine("Fail");
}
Pass
4. جملة if المتداخلة
يمكن تداخل عبارات «if»، لكن حاول ألا يتجاوز التداخل مستويين. فالتداخل العميق يضر بقابلية القراءة — فكر في استخراج دالة أو استخدام «else if» بدلاً من ذلك.
▶ مثال
int age = 25;
bool hasTicket = true;
if (age >= 18)
{
if (hasTicket)
{
Console.WriteLine("Admitted");
}
else
{
Console.WriteLine("Ticket required");
}
}
else
{
Console.WriteLine("Too young");
}
Admitted
5. عبارة switch
تقوم عبارة switch بمقارنة تعبير ما بقيم ثابتة متعددة وتنفيذ الفرع المقابل لكل حالة. وعلى عكس لغتي C/C++، لا تسمح لغة C# بـ«المرور التلقائي» (fall-through)؛ حيث يجب أن تنتهي كل حالة بكلمة break أو return أو throw، وإلا سيحدث خطأ في التحويل البرمجي.
▶ مثال
int day = 3;
switch (day)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
case 4:
Console.WriteLine("Thursday");
break;
case 5:
Console.WriteLine("Friday");
break;
default:
Console.WriteLine("Weekend");
break;
}
Wednesday
يمكن لعدة حالات أن تشترك في نفس المنطق من خلال سرد تسمياتها بالتتابع:
int month = 2;
switch (month)
{
case 12:
case 1:
case 2:
Console.WriteLine("Winter");
break;
case 3:
case 4:
case 5:
Console.WriteLine("Spring");
break;
default:
Console.WriteLine("Other season");
break;
}
Winter
نصيحة: في لغة C#، إذا كنت بحاجة فعلاً للانتقال من حالة إلى أخرى، فيجب عليك استخدام
goto case x؛ ولا يُسمح بإغفال الأمر break من أجل التخطي التلقائي.
6. تعبيرات Switch (C# 8+)
قدمت لغة C# 8 تعبيرات switch، وهي تعبيرات وليست جمل برمجية. وهي تُرجع النتيجة المطابقة باستخدام صيغة أكثر إيجازًا. استخدم _ للفرع الافتراضي.
▶ مثال
int code = 404;
string message = code switch
{
200 => "OK",
301 => "Moved",
404 => "Not Found",
500 => "Server Error",
_ => "Unknown"
};
Console.WriteLine(message);
Not Found
7. أساسيات مطابقة الأنماط
ابتداءً من الإصدار C# 7، يمكنك استخدام مطابقة الأنماط في المنطق الشرطي. ومن بين الأشكال الشائعة أنماط الأنواع (is Type variable) وعبارات «when guard».
▶ مثال
object obj = "Hello C#";
if (obj is string s)
{
Console.WriteLine($"String length: {s.Length}");
}
else
{
Console.WriteLine("Not a string");
}
String length: 8
استخدم عبارة "when" في جملة "switch" لإضافة شروط إضافية:
int value = 15;
string category = value switch
{
int i when i > 100 => "Extra large",
int i when i > 10 => "Medium",
int i when i > 0 => "Small",
_ => "Invalid"
};
Console.WriteLine(category);
Medium
8. عامل التشغيل الشرطي ?:
المُشغِّل الشرطي ?:، المعروف أيضًا باسم المُشغِّل الثلاثي، هو اختصار لعبارة if...else. صيغته هي condition ? valueIfTrue : valueIfFalse، ويُحسب التعبير بأكمله ليُعطي القيمة المقابلة.
▶ مثال
int age = 20;
string status = age >= 18 ? "Adult" : "Minor";
Console.WriteLine(status);
Adult
الاستخدام المتداخل (تجنب التداخل المفرط):
int score = 75;
string result = score >= 90 ? "A" : score >= 60 ? "B" : "C";
Console.WriteLine(result);
B
تحذير: تنخفض سهولة القراءة بشكل حاد عندما يتم تداخل المشغل الشرطي لأكثر من مستويين. استخدم جمل «if...else if» بدلاً من ذلك.
❓ أسئلة شائعة
=> وأذرعًا مفصولة بفواصل. أما جملة switch فهي جملة لا تتطلب قيمة مُرجعة، وتستخدم كتل case/break.is و==؟== يقارن القيم للتأكد من تساويها، بينما يُستخدم is لمطابقة الأنماط ويمكنه التحقق من النوع أثناء إعلان المتغير، مثل obj is string s.📖 ملخص
- تقوم عبارة «if» بتنفيذ كتلة من التعليمات البرمجية بناءً على شرط منطقي
- توفر عبارة «if...else» تفرعًا ثنائي الاتجاه؛ بينما تتعامل عبارة «else if» مع شروط متعددة متنافية
- احرص على ألا يتجاوز عدد مستويات العبارات الشرطية المتداخلة مستويين أو أقل، وذلك لتسهيل قراءتها
- تقوم كلمة switch بمطابقة القيم الثابتة؛ بينما تمنع لغة C# التخطي التلقائي (fall-through) وتشترط استخدام break أو return أو throw
- تعبيرات Switch (C# 8+) هي بديل موجز يُرجع قيمةً باستخدام
_كقيمة افتراضية - تستخدم مطابقة الأنماط
is Type varللتحقق من الأنواع واستخراج القيم؛ وعندما تضيف الشروط الحارسة شروطًا إضافية - يعمل المشغل الشرطي
?:على تبسيط عمليات التعيين الثنائية البسيطة
📝 تمارين
- اكتب برنامجًا يقرأ عددًا صحيحًا ويحدد ما إذا كان موجبًا أم سالبًا أم صفرًا، ثم يعرض النتيجة
- استخدم تعبير «switch» لربط كل شهر (1-12) باسم الموسم المقابل له
- اكتب برنامجًا يستقبل متغيرًا من نوع «كائن»، ويستخدم مطابقة الأنماط
isلتحديد نوعه (عدد صحيح، أو سلسلة، أو غير ذلك)، ثم يعرض النوع والقيمة - استخدم المشغل الشرطي لتحويل الدرجة الرقمية إلى درجة حرفية (90+ تعني A، و80+ تعني B، و60+ تعني C، وإلا فهي D)، ثم قارن سهولة القراءة مع نسخة تستخدم if...else if