تعبيرات switch
عبارات switch موجزة تعيد قيمًا
تعبيرات switch درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما المقصود بتعبير switch؟
يقيّم تعبير switch مدخلًا مقابل سلسلة من الأنماط، ثم يُرجع قيمة. وعلى خلاف تعليمة switch التقليدية، فهو تعبير يُنتج نتيجة يمكن إسنادها أو إرجاعها.
تُستخدم الكلمة المفتاحية switch بعد القيمة، وتُكتب الفروع بالصيغة pattern => result. وهذا يجعل منطق التفرع موجزًا وذا طابع وظيفي.
int code = 2;
string name = code switch
{
1 => "One",
2 => "Two",
_ => "Other"
};
System.Console.WriteLine(name);التعليمة مقابل التعبير
تستخدم تعليمة switch القديمة تسميات case وbreak. أما تعبير switch الأحدث فيستغني عن هاتين الكلمتين المفتاحيتين تمامًا.
تُفصل الفروع بفواصل، وينتهي البناء كله بفاصلة منقوطة، ويُنتج كل فرع قيمة بدلًا من تنفيذ كتل متتابعة. وهذا يزيل فئة كاملة من الأخطاء الناتجة عن نسيان break.
// Statement style
switch (code) { case 1: result = "One"; break; }
// Expression style
result = code switch { 1 => "One", _ => "?" };فرع التجاهل
تُعد الشرطة السفلية _ نمط التجاهل. فهي تطابق أي شيء وتعمل بوصفها الحالة الافتراضية.
يجب أن تكون تعبيرات switch شاملة لجميع الحالات: فإذا لم يطابق أي فرع المدخل وقت التشغيل، يُرمى استثناء SwitchExpressionException. وتضمن إضافة فرع _ وجود تطابق لكل مدخل محتمل.
using System;
class Program {
static void Main() {
int n = 7;
string size = n switch {
< 5 => "small",
_ => "big"
};
Console.WriteLine(size);
}
}الأنماط الثابتة
يستخدم أبسط الفروع نمطًا ثابتًا: قيمة حرفية تُقارن بالمدخل باستخدام المساواة.
يمكن أن تكون الثوابت أرقامًا أو سلاسل نصية أو محارف أو أعضاء تعداد أو ثوابت مسمّاة. ويُقيَّم كل منها من الأعلى إلى الأسفل، لذا رتّبوا الفروع الأكثر تحديدًا أو شيوعًا أولًا.
char grade = 'B';
string label = grade switch
{
'A' => "Excellent",
'B' => "Good",
'C' => "Fair",
_ => "Needs work"
};
System.Console.WriteLine(label);الإرجاع من أسلوب
تتألق تعبيرات switch داخل الأساليب. وبما أن البناء بأكمله تعبير، يمكنكم إرجاعه مباشرة باستخدام return، وغالبًا ما يكون ذلك في أسلوب ذي جسم تعبيري مكوّن من سطر واحد.
يحافظ هذا على وضوح منطق التعيين ومركزيته بدلًا من نثر سلاسل if/else if في أنحاء الجسم.
using System;
class Program {
static string Day(int d) => d switch {
0 => "Sun", 6 => "Sat", _ => "Weekday"
};
static void Main() => Console.WriteLine(Day(6));
}استخدام switch مع التعدادات
تتوافق التعدادات طبيعيًا مع تعبيرات switch. يذكر كل فرع عضوًا من أعضاء التعداد، ويمكن للمصرّف التحذير عند غياب حالة ما إذا حذفتم فرع التجاهل.
ومع ذلك، من الحكمة الإبقاء على فرع _ حتى لا تتسبب قيم التعداد المستقبلية في تعطل تطبيقكم وقت التشغيل.
using System;
enum Light { Red, Yellow, Green }
class Program {
static void Main() {
Light l = Light.Green;
string action = l switch {
Light.Red => "Stop",
Light.Yellow => "Slow",
Light.Green => "Go",
_ => "?"
};
Console.WriteLine(action);
}
}شروط الحراسة باستخدام when
يضيف شرط when قيمة منطقية إلى أحد الفروع. ولا يطابق الفرع إلا إذا كان كل من النمط وشرط الحراسة صحيحًا.
يتيح هذا تنقيح المطابقات باستخدام منطق اعتباطي لا يستطيع النمط وحده التعبير عنه، مثل فحوص النطاقات المدمجة مع متغيرات أخرى.
int temp = 30;
string weather = temp switch
{
int t when t < 0 => "Freezing",
int t when t < 20 => "Cool",
_ => "Warm"
};
System.Console.WriteLine(weather);الترتيب مهم
تُختبر الفروع حسب ترتيبها في الشفرة. ويفوز أول فرع مطابق، لذا يجب وضع الأنماط الأكثر تحديدًا قبل الأنماط الأعم.
إذا سبق فرع عام فرعًا محددًا، يبلّغ المصرّف عن الفرع اللاحق باعتباره غير قابل للوصول. اقرأوا الفروع من الأعلى إلى الأسفل كقمع ينتقل من الأضيق إلى الأوسع.
int score = 95;
string tier = score switch
{
>= 90 => "Gold",
>= 70 => "Silver",
_ => "Bronze"
};
System.Console.WriteLine(tier);اكتمال الحالات والاستثناءات
إذا لم تُغطَّ كل المدخلات ولم يطابق أي فرع، يرمي وقت التشغيل System.Runtime.CompilerServices.SwitchExpressionException.
يُصدر المصرّف التحذير CS8509 عندما لا يستطيع إثبات اكتمال الحالات. تعاملوا مع هذا التحذير بجدية: أضيفوا فرع تجاهل أو غطّوا القيم المفقودة حتى يبقى التعبير شاملًا.
using System;
class Program {
static void Main() {
try {
int x = 5;
string s = x switch { 1 => "a", 2 => "b" };
Console.WriteLine(s);
} catch (Exception e) {
Console.WriteLine(e.GetType().Name);
}
}
}دمج مدخلات متعددة
للتبديل بناءً على أكثر من قيمة، لفّوا القيم داخل tuple. عندئذٍ تطابق الفروع أنماط tuple، وتقارن كل موضع.
يُعد هذا مثاليًا لآلات الحالات أو جداول القرار التي تعتمد نتيجتها على عاملين. سنتناول أنماط tuple بالتفصيل في درس لاحق.
bool isWeekend = true; bool isRaining = false;
string plan = (isWeekend, isRaining) switch
{
(true, false) => "Go hiking",
(true, true) => "Watch a movie",
_ => "Work"
};
System.Console.WriteLine(plan);أجسام تعبيرية واضحة
تتآلف تعبيرات switch جيدًا مع LINQ والأعضاء ذات الأجسام التعبيرية، فتنتج مسارات معالجة موجزة.
وبما أن كل فرع يُرجع قيمة، يمكنكم استخدام تعبير switch مباشرة داخل إسقاط Select أو بوصفه وسيطًا لأسلوب، من دون الحاجة إلى متغيرات مؤقتة.
using System;
using System.Linq;
class Program {
static void Main() {
var nums = new[] { 1, 2, 3 };
var labels = nums.Select(n => n switch {
1 => "one", 2 => "two", _ => "many"
});
Console.WriteLine(string.Join(",", labels));
}
}اختبار سريع
اختبروا مدى فهمكم لتعبيرات switch.
مراجعة
تُرجع تعبيرات switch قيمة باستخدام input switch { pattern => result, ... } مع فروع مفصولة بفواصل.
استخدموا _ للحالة الافتراضية، وwhen لشروط الحراسة، وتذكّروا أن الفروع تُختبر من الأعلى إلى الأسفل. اجعلوا الفروع شاملة لجميع الحالات لتجنب استثناءات وقت التشغيل. سنستكشف بعد ذلك أنماط الأنواع والخصائص.
الأسئلة الشائعة
هل درس «تعبيرات switch» مجاني؟
نعم — نص درس «تعبيرات switch» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعبيرات switch»؟
عبارات switch موجزة تعيد قيمًا تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تعبيرات switch»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.