Конструкції switch мають давню й шановану історію у мовах програмування. Їх запровадили в C, де вони цінувалися за швидкість. Та швидкість давалася ціною вельми обмеженої функціональності. У C# роль конструкції switch розширили за межі цілих чисел. Конструкції switch можуть охоплювати будь-який довільний тип, значення чи посилання.
Якщо ми приходимо з функціональної мови, то найближчим до дискримінованих обʼєднань і зіставлення зі зразком, що є в C#, буде саме робота з конструкціями switch (і виразами switch, про які йдеться в іншому місці). Однак вони аж ніяк не зрівняються з дискримінованими обʼєднаннями у здатності забезпечувати безпеку типів.
Прості конструкції switch нагадують своїх предків із C і поєднують switch, case, break та default.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
Наведену конструкцію можна застосувати до будь-якого простого типу: примітивів і рядків тексту (англ. string).
Коли до цього додаються типи посилань, потрібен додатковий синтаксис: спершу звести тип, а потім додати перевірки (when), хоч перевірки можна застосовувати й до простих випадків зі значеннями. Це показано нижче:
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default необовʼязкова, але зазвичай бажана.break обовʼязкова для будь-якої непорожньої гілки case.case має бути похідним від типу аргументу switch. Аргумент switch типу Object, очевидно, дає найширший вибір.case.case з різними аргументами case можуть указувати на один і той самий блок коду.Документація з конструкції switch дає вступ до конструкцій switch.