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.
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:
Total belanja: 350000
Diskon: 10%Mari kita telaah baris demi baris:
- Baris 1 (
int totalBelanja = 350000;): Data input disiapkan sebagai variabelint. - Baris 3–9 (
int persenDiskon = totalBelanja switch): Hasil pemetaan langsung diikat ke variabelpersenDiskon; compiler memeriksa arm dari atas ke bawah dan memakai arm pertama yang cocok. - Baris 5 (
>= 500000 => 20): Pola>= 500000merupakan relational pattern karena membandingkan input dengan batas nilai. Nilai350000tidak memenuhi, sehingga arm ini dilewati. - Baris 6 (
>= 250000 => 10): Nilai350000memenuhi syarat, sehingga arm ini terpilih dan menghasilkan10. - Baris 8 (
_ => 0): Discard menampung sisa nilai yang tidak cocok dengan arm mana pun, misalnya belanja80000yang 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.
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:
Nilai 78: predikat B
Hari ke-6: Akhir pekanArm 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.