Section Control Flow memperkenalkan switch expression sebagai penghasil nilai yang ringkas. Bab ini menelusuri sisi mekanikanya yang bertumpu pada pattern matching: aturan keutuhan arm, clause when sebagai guard, input tuple untuk beberapa nilai sekaligus, dan arm yang boleh melempar exception. Dengan memahami mekanika ini, arm tidak lagi sekadar daftar, melainkan tabel keputusan yang diperiksa compiler.
Aturan Keutuhan (Exhaustiveness) #
Switch expression wajib menjangkau seluruh kemungkinan input. Untuk enum, mencantumkan semua anggota belum cukup: nilai tanpa nama seperti hasil cast masih mungkin masuk, sehingga arm _ diperlukan. Tanpa arm itu, compiler memancarkan warning berikut (path project dipangkas):
Program.cs(3,25): warning CS8524: The switch expression does not handle some values of its input type (it is not exhaustive) involving an unnamed enum value. For example, the pattern '(JenisKirim)3' is not covered.When Guard dan Input Tuple #
Clause when menyaring arm dengan syarat tambahan tanpa menambah arm baru. Untuk keputusan yang melibatkan dua nilai, input berupa tuple (a, b) dan setiap arm berupa tuple pattern. Arm tetap dinilai dari atas ke bawah, sehingga guard dan arm spesifik diletakkan sebelum arm umum.
Contoh: Tarif dan Estimasi Pengiriman #
public enum JenisKirim { Reguler, Kilat, Instan }
JenisKirim jenis = JenisKirim.Kilat;
int beratGram = 1500;
int biaya = (jenis, beratGram) switch
{
(JenisKirim.Instan, _) => 34000,
(JenisKirim.Kilat, > 1000) => 26000,
(JenisKirim.Kilat, _) => 20000,
(JenisKirim.Reguler, > 1000) when beratGram % 500 == 0 => 14000,
(JenisKirim.Reguler, _) => 12000,
_ => 12000
};
Console.WriteLine($"Biaya kirim: {biaya}");
string estimasi = jenis switch
{
JenisKirim.Instan => "2 jam",
JenisKirim.Kilat => "1 hari",
JenisKirim.Reguler => "3-5 hari",
_ => "Estimasi tidak dikenal"
};
Console.WriteLine($"Estimasi: {estimasi}");
int jumlah = 0;
try
{
string validasi = jumlah switch
{
> 0 => "Jumlah valid",
_ => throw new ArgumentException("Jumlah harus positif")
};
Console.WriteLine(validasi);
}
catch (ArgumentException e)
{
Console.WriteLine($"Ditangkap: {e.Message}");
}Output yang Dihasilkan:
Biaya kirim: 26000
Estimasi: 1 hari
Ditangkap: Jumlah harus positifMari kita bedah baris demi baris:
(jenis, beratGram) switch: Input tuple membawa dua nilai sekaligus, sehingga aturan tarif yang bergantung pada jenis dan berat tidak butuhifbertingkat.(JenisKirim.Kilat, > 1000): Posisi pertama constant pattern anggota enum, posisi kedua relational pattern; arm ini tercapai karena berat1500melewati seribu.when beratGram % 500 == 0: Guard menyaring arm Reguler berat besar; bila guard gagal, penilaian berlanjut ke arm berikutnya._ => 12000di akhir: Arm discard menampung nilai enum tak bernama agar tidak ada warning CS8524._ => throw new ArgumentException(...): Arm boleh melempar exception karena arm harus berupa expression, dan throw expression adalah expression; hasilnya tertangkap blokcatchdi bawahnya.
Memilih Switch Expression atau Switch Statement #
Switch expression cocok ketika setiap cabang menghasilkan satu nilai dan daftar armnya dapat diperiksa keutuhannya. Switch statement tetap lebih pas bila cabang menjalankan banyak statement atau butuh goto case. Compiler membantu lewat warning keutuhan, sehingga penambahan anggota enum baru langsung terlihat titik yang belum tertangani.