Switch statement menghasilkan nilai dengan cara menyimpan hasil ke variabel di dalam setiap case, sehingga satu keputusan kecil bisa memakan belasan baris. Sejak C# 8, switch expression menawarkan bentuk ringkas: setiap cabang berupa pattern yang dipetakan langsung ke sebuah nilai hasil. Struktur ini sangat cocok untuk kasus seperti menentukan persentase diskon dari total belanja.

Sintaks Panah dan Arm #

Switch expression terdiri atas input, kata kunci switch, lalu daftar arm di dalam kurung kurawal. Setiap arm berbentuk <pattern> => <ekspresi>, dan arm terakhir biasanya _ (discard) yang berperan seperti default. Karena berupa expression, seluruh hasil akhirnya diikat ke satu variabel, dan compiler menuntut semua kemungkinan nilai input tercakup.

csharp
int totalBelanja = 350000;

int persenDiskon = totalBelanja switch
{
    >= 500000 => 20,
    >= 250000 => 10,
    >= 100000 => 5,
    _ => 0
};

Console.WriteLine($"Total belanja: {totalBelanja}");
Console.WriteLine($"Diskon: {persenDiskon}%");

Output yang Dihasilkan:

text
Total belanja: 350000
Diskon: 10%

Mari kita telaah baris demi baris:

  1. Baris 1 (int totalBelanja = 350000;): Data input disiapkan sebagai variabel int.
  2. Baris 3–9 (int persenDiskon = totalBelanja switch): Hasil pemetaan langsung diikat ke variabel persenDiskon; compiler memeriksa arm dari atas ke bawah dan memakai arm pertama yang cocok.
  3. Baris 5 (>= 500000 => 20): Pola >= 500000 merupakan relational pattern karena membandingkan input dengan batas nilai. Nilai 350000 tidak memenuhi, sehingga arm ini dilewati.
  4. Baris 6 (>= 250000 => 10): Nilai 350000 memenuhi syarat, sehingga arm ini terpilih dan menghasilkan 10.
  5. Baris 8 (_ => 0): Discard menampung sisa nilai yang tidak cocok dengan arm mana pun, misalnya belanja 80000 yang mendapat diskon nol persen.

Relational dan Logical Pattern #

Relational pattern (>, >=, <, <=) membandingkan input dengan batas tertentu. Beberapa pattern boleh digabung dengan logical pattern: operator and menuntut dua syarat terpenuhi sekaligus, operator or cukup satu, dan operator not membalik hasil pencocokan.

csharp
int nilai = 78;

string predikat = nilai switch
{
    >= 80 and <= 100 => "A",
    >= 60 and < 80 => "B",
    < 60 => "C",
    _ => "Di luar rentang"
};

Console.WriteLine($"Nilai {nilai}: predikat {predikat}");

int hari = 6;

string jenisHari = hari switch
{
    6 or 7 => "Akhir pekan",
    _ => "Hari kerja"
};

Console.WriteLine($"Hari ke-{hari}: {jenisHari}");

Output yang Dihasilkan:

text
Nilai 78: predikat B
Hari ke-6: Akhir pekan

Arm pertama menuntut nilai berada di antara 80 dan 100 secara bersamaan lewat and. Nilai 78 tidak memenuhi, lalu jatuh ke arm kedua >= 60 and < 80 yang menghasilkan predikat B. Pada contoh kedua, pattern 6 or 7 mencocokkan dua konstanta sekaligus, sehingga hari ke-6 terdeteksi sebagai akhir pekan. Arm dievaluasi berurutan, sehingga arm yang lebih spesifik sebaiknya diletakkan lebih dulu dan discard selalu di posisi terakhir.