تنفّذ جملة if كتلة من الشيفرة فقط حين يكون الشرط صحيحًا. تضيف else if اختبارات أخرى، وتلتقط else كل ما لم تلتقطه الاختبارات.
المخرجات:
Order 120: shipping 0
Order 75.50: shipping 4.99
Order 20: shipping 9.99
تُفحص الشروط من الأعلى إلى الأسفل ويفوز أول شرط صحيح. طلب بقيمة 120 يطابق >= 100 ولا يصل أبدًا إلى الاختبار >= 50، ولهذا يأتي الشرط الأكثر تحديدًا أولًا. else if ليست كلمة محجوزة مستقلة: إنها else جسمها if أخرى، فلا توجد elseif ولا elif في C#.
يجب أن تكون الشروط من نوع bool
لا تعامل C# رقمًا أو نصًا أو كائنًا على أنه true أو false أبدًا. يجب أن يكون نوع التعبير بين القوسين bool:
int count = 3;
if (count) // error CS0029: Cannot implicitly convert type 'int' to 'bool'
if (count > 0) // correct
if (name) // error: a string is not a bool either
if (name != null) // correct
يزيل هذا عائلة كاملة من الأخطاء الموجودة في C وJavaScript، حيث تُحسب 0 و"" وnull بصمت على أنها false. الثمن أنك تكتب المقارنة كاملة في كل مرة، وهذا يجعل القصد واضحًا للقارئ التالي أيضًا.
دمج الشروط بـ && و|| و!
تدمج && (و) و|| (أو) و! (النفي) الاختبارات المنطقية. تعمل && و|| بدارة قصيرة: لا يُنفَّذ الطرف الثاني إلا إن لم يحسم الطرف الأول الإجابة.
المخرجات:
maya: welcome
invalid or banned account
invalid or banned account
omar: age 9 rejected
invalid or banned account
الاستدعاء مع null آمن بفضل الدارة القصيرة: بمجرد أن تكون username != null خاطئة لا تُقيَّم username.Length أبدًا، فلا NullReferenceException. اعكس الترتيب إلى username.Length >= 3 && username != null فينهار الاستدعاء نفسه.
ترتبط && بقوة أكبر من ||، فمعنى a || b && c هو a || (b && c). أضف أقواسًا كلما خلطت بينهما؛ المترجم لا يحتاجها، لكن القرّاء يحتاجونها. تعمل & و| المفردتان أيضًا على bool، لكنهما تقيّمان الطرفين دائمًا. لا تستخدمهما إلا حين يكون للطرف الثاني أثر جانبي يجب أن يحدث.
الأقواس المعقوصة وقاعدة العبارة الواحدة
الأقواس اختيارية حين يحمل الفرع عبارة واحدة. دونها لا تنتمي إلى if إلا العبارة التالية، أيًّا كان ما تقوله الإزاحة:
المخرجات:
Reorder email sent
Stock: 12
تُطبع "Reorder email sent" مع أن المخزون كافٍ: WriteLine الثانية خارج if رغم الإزاحة. حارس في سطر واحد مثل if (x == null) return; مقبول دون أقواس؛ أما كل ما قد يكتسب سطرًا ثانيًا فيستحقها.
خطأ مرتبط هو فاصلة منقوطة مباشرة بعد الشرط. تنهي if (stock < 5); جملة if بعبارة فارغة، وتُنفَّذ الكتلة التالية دون شرط. يميّزها المترجم بالتحذير CS0642، Possible mistaken empty statement، ويستحق أن يُعامل كخطأ.
= مقابل == في الشرط
= تُسند و== تقارن. في معظم الأنواع لا تُترجم كتابة = خطأً، لأن نتيجة الإسناد هي القيمة المُسندة وint ليس bool:
int score = 10;
if (score = 100) { } // error CS0029: Cannot implicitly convert type 'int' to 'bool'
مع متغيّر bool يكون الإسناد نفسه bool، فيُترجم الخطأ المطبعي:
المخرجات:
Access granted
isAdmin is now True
كتب الشرط فوق isAdmin ثم اختبر القيمة الجديدة. يحذّر المترجم (CS0665، الإسناد في تعبير شرطي ثابت دائمًا)، لكن البناء ينجح. مع القيم المنطقية تخلَّ عن المقارنة تمامًا: if (isAdmin) وif (!isAdmin) أسهل قراءة ولا يمكن أن تُكتبا خطأً بهذه الطريقة.
if المتداخلة مقابل جمل الحراسة
كل مستوى تداخل شرط آخر على القارئ أن يحمله في ذهنه. حين يرفض كل فحص المدخلات السيئة، اخرج مبكرًا بدل وضع المسار السليم داخلها جميعًا:
المخرجات:
ordered 2 x keyboard
error: no product
error: quantity must be positive
error: insufficient balance
كانت النسخة المتداخلة من الدالة نفسها ستحتوي على ثلاثة مستويات من if مع العمل الحقيقي في الكتلة الأعمق وثلاثة فروع else تنحلّ في الأسفل. مع جمل الحراسة تجلس كل قاعدة بجانب رسالة خطئها ويكون السطر الأخير هو الحالة العادية. وتعمل الفكرة نفسها داخل الحلقات بـ continue.
التصريح بمتغيّرات داخل الشرط
يمكن للشرط أن يصرّح بمتغيّر يكون في النطاق داخل if. الشكلان الشائعان out var من دالة TryParse ونمط النوع is:
المخرجات:
42: positive number 42
abc: not a number
-7: number -7, not positive
string of length 5
تعيد TryParse القيمة false بدل رمي استثناء مع المدخلات السيئة، وهذا يجعلها مناسبة طبيعيًا لـ if. تغطي صفحة تحويل الأنواع دوال القراءة بالتفصيل.
متى تستخدم شيئًا آخر
- اختيار إحدى قيمتين: المعامل الشرطي
condition ? a : bأقصر منifتُسند في الفرعين. - فروع كثيرة على قيمة واحدة: تقارن جملة
switchقيمة بحالات ثابتة وهي أسهل تصفحًا من عشرة أسطرelse if. - ربط قيمة بنتيجة: يحلّ البحث في
Dictionaryمحل سلسلة طويلة حين لا تختلف الفروع إلا في البيانات.
الأسئلة الشائعة
كيف تكتب else if في C#؟
اكتب else if كلمتين: if (a) { ... } else if (b) { ... } else { ... }. تُختبر الشروط من الأعلى إلى الأسفل ولا يُنفَّذ إلا أول فرع صحيح، فضع الاختبار الأكثر تحديدًا أولًا. لا توجد كلمة محجوزة elif أو elseif.
لماذا لا أستطيع كتابة if (count) في C#؟
يجب أن يكون الشرط في C# من نوع bool. بخلاف C وJavaScript لا يُحوَّل int أو نص أو كائن إلى true أو false أبدًا، فتفشل if (count) بالخطأ CS0029، Cannot implicitly convert type 'int' to 'bool'. اكتب الاختبار الذي تقصده: if (count > 0) أو if (name != null).
ما الفرق بين && و& في شرط if؟
تعمل && بدارة قصيرة: إن كان الطرف الأول false لا يُقيَّم الطرف الثاني أبدًا، وهذا ما يجعل s != null && s.Length > 0 آمنة. أما & على قيمتين منطقيتين فتقيّم الطرفين في كل مرة. وينطبق الأمر نفسه على || و|. استخدم && و|| في الشروط ما لم تكن تحتاج إلى الأثر الجانبي للطرف الثاني.
هل الأقواس المعقوصة إلزامية في جملة if في C#؟
لا. دون أقواس تتحكم if في عبارة واحدة بالضبط. إزاحة سطر ثانٍ لا تضيفه إلى الفرع، وهذا مصدر تقليدي للأخطاء، لذا توصي معظم أدلة الأسلوب بالأقواس في كل فرع.
هل يمكنني كتابة if else في سطر واحد في C#؟
لاختيار قيمة استخدم المعامل الشرطي: string label = score >= 50 ? "pass" : "fail";. ولتنفيذ عبارات تكون if (x) DoA(); else DoB(); صحيحة في سطر واحد، لكنها أصعب قراءة وتوسيعًا من كتلة بين أقواس.