Percabangan Select Case memilih satu blok pernyataan berdasarkan nilai dari satu ekspresi uji. Topik ini membahas klausa rentang dengan To, pembanding Is, daftar nilai yang dipisah koma, dan penanganan kasus lain dengan Case Else. Perilaku eksekusi case pertama yang cocok serta pemilihan antara Select Case dan If/ElseIf juga menjadi bagian pembahasan. Seluruh contoh berupa program console yang dijalankan sungguhan sehingga keluarannya dapat direproduksi.
Struktur Select Case#
Pernyataan Select Case menguji satu ekspresi terhadap sejumlah daftar nilai yang dituliskan pada klausa Case. Ekspresi uji dievaluasi satu kali saja di awal. VB kemudian membandingkan hasilnya dengan setiap klausa Case dari atas ke bawah. Blok pernyataan pada case pertama yang cocok dijalankan sampai klausa Case, Case Else, atau End Select berikutnya, lalu eksekusi berlanjut ke pernyataan setelah End Select. Blok case yang tidak terpilih tidak pernah dijalankan, sehingga VB tidak mengenal perilaku jatuh (fall-through) seperti pada pernyataan switch di bahasa berbasis C.
Contoh klasik pemanfaatan Select Case adalah konversi nilai ujian menjadi huruf. Rentang 90 sampai 100 dituliskan sebagai Case 90 To 100, sedangkan klausa Case Else digunakan untuk nilai yang tidak masuk ke rentang mana pun.
Module KonversiNilai
Sub Main()
Dim nilai As Integer = 85
Dim huruf As String
Select Case nilai
Case 90 To 100
huruf = "A"
Case 80 To 89
huruf = "B"
Case 70 To 79
huruf = "C"
Case 60 To 69
huruf = "D"
Case 0 To 59
huruf = "E"
Case Else
huruf = "tidak valid"
End Select
Console.WriteLine($"Nilai {nilai} mendapat huruf {huruf}")
End Sub
End ModuleNilai 85 mendapat huruf BProgram di atas dijalankan dengan pola yang dijelaskan pada topik Program Pertama, yaitu proyek console baru dibuat, isi Program.vb diganti dengan kode program di atas, kemudian dotnet run mengeksekusinya.
# tidak-dijalankan
dotnet new console -lang VB -n KonversiNilai
cd KonversiNilai
# ganti isi Program.vb dengan kode program di atas
dotnet runPada contoh tersebut, nilai 85 diuji terhadap kelima rentang dan pencocokan berhenti pada Case 80 To 89, sehingga huruf terisi B. Rentang 0 sampai 59 sengaja dituliskan secara eksplisit, sehingga Case Else hanya menerima nilai yang tidak valid, misalnya 105 atau -3. Pola ini menjadikan Case Else sebagai penanda kejanggalan data dan bukan sebagai klasifikasi sah.
Perilaku tersebut dapat dibaca sebagai alur dari atas ke bawah pada diagram berikut, yaitu hanya blok case pertama yang cocok yang dijalankan.
Rentang dengan To dan pembanding Is#
Klausa Case menerima tiga bentuk klausa pencocokan. Bentuk pertama adalah rentang tertutup Case awal To akhir yang mencakup kedua batasnya, dengan syarat nilai awal tidak melebihi nilai akhir. Bentuk kedua adalah pembanding Case Is >= batas yang menerima operator =, <>, <, <=, >, dan >=. Bentuk ketiga berupa satu nilai saja, misalnya Case 0, yang berarti kesamaan persis. Ketiga bentuk dapat dicampur dalam satu klausa dengan pemisah koma, misalnya Case 1 To 4, 7 To 9, 11, 13, Is > 20.
Program berikut menggabungkan nilai tunggal, daftar nilai, dan dua pembanding Is dalam satu Select Case untuk menentukan ruang pertemuan berdasarkan jumlah peserta.
Module KategoriPeserta
Sub Main()
Dim jumlah As Integer = 24
Select Case jumlah
Case 0
Console.WriteLine("Belum ada peserta")
Case 1, 2, 3, 4, 5
Console.WriteLine("Gunakan ruang kelas kecil")
Case Is >= 100
Console.WriteLine("Gunakan auditorium")
Case Is >= 20
Console.WriteLine("Gunakan ruang serbaguna")
Case Else
Console.WriteLine("Gunakan ruang kelas biasa")
End Select
End Sub
End ModuleGunakan ruang serbagunaNilai 24 gagal pada Case 0 dan pada daftar 1 sampai 5, juga pada Case Is >= 100. Pencocokan berhenti pada Case Is >= 20 sehingga keluarannya menyebut ruang serbaguna. Apabila kedua pembanding itu dibalik urutannya, Case Is >= 20 menelan seluruh nilai di atas 19 sebelum Case Is >= 100 sempat diperiksa, dan auditorium tidak akan pernah terpilih.
Daftar nilai dan Case Else#
Daftar nilai dipisahkan koma dan setiap anggotanya boleh berupa nilai tunggal, rentang, atau pembanding. Pencocokan berhenti pada anggota pertama yang cocok, sedangkan anggota sesudahnya tidak dievaluasi lagi. Daftar ini menggantikan rangkaian nilai = x OrElse nilai = y yang panjang, sehingga Select Case sering kali lebih ringkas untuk kebutuhan tersebut. Rentang juga berlaku untuk string, dan pencocokannya mengikuti pengaturan Option Compare pada proyek, sehingga huruf besar dan huruf kecil dapat diperlakukan sama apabila Option Compare Text digunakan.
Program berikut menerapkan daftar nilai string pada sebuah Select Case. Nama hari dikelompokkan menjadi hari kerja dan akhir pekan, dengan Case Else sebagai penangkap nama yang tidak dikenal.
Module JenisHari
Sub Main()
Dim hari As String = "Rabu"
Select Case hari
Case "Senin", "Selasa", "Rabu", "Kamis", "Jumat"
Console.WriteLine($"{hari} adalah hari kerja")
Case "Sabtu", "Minggu"
Console.WriteLine($"{hari} adalah akhir pekan")
Case Else
Console.WriteLine($"{hari} bukan nama hari yang dikenal")
End Select
End Sub
End ModuleRabu adalah hari kerjaCase Else dijalankan apabila tidak ada satu pun klausa Case yang cocok. Klausa ini tidak wajib, tetapi dokumentasi resmi menyarankannya agar nilai yang tidak terduga tetap mendapat penanganan. Tanpa Case Else dan tanpa kecocokan, eksekusi langsung melompat ke pernyataan setelah End Select sehingga tidak ada blok yang dijalankan.
Memilih antara Select Case dan If/ElseIf#
Select Case paling tepat apabila satu ekspresi dibandingkan dengan banyak nilai, rentang, atau daftarnya. Ekspresi uji hanya dievaluasi satu kali, sedangkan rantai If/ElseIf yang membaca variabel yang sama pada setiap tingkat mengulang pembacaan tersebut di setiap kondisi. Klausa To dan pembanding Is juga tidak tersedia pada If/ElseIf, sehingga pencocokan rentang pada Select Case lebih pendek untuk dituliskan.
If/ElseIf tetap lebih tepat apabila setiap kondisi menguji variabel yang berbeda atau menggabungkan beberapa syarat dengan AndAlso dan OrElse. Select Case tidak dapat menguji dua variabel sekaligus karena ekspresi ujinya hanya satu. Dokumentasi resmi memberikan patokan yang sama, yaitu Select Case lebih berguna apabila satu ekspresi memiliki beberapa nilai yang mungkin. Tabel berikut merangkum perbandingan keduanya.
| Aspek | Select Case | If/ElseIf |
|---|---|---|
| Ekspresi yang diuji | satu ekspresi untuk seluruh case | setiap kondisi boleh berbeda |
| Rentang nilai | klausa To dan pembanding Is | disusun dengan AndAlso dan pembanding |
| Daftar nilai | dipisah koma dalam satu Case | dirangkai dengan OrElse |
| Kondisi lintas variabel | tidak didukung | didukung |
Kesalahan umum#
Kesalahan pada Select Case umumnya menyangkut urutan klausa dan luas cakupan Case Else. Keduanya tidak memicu error kompilasi, sehingga kesalahannya baru terlihat pada keluaran program.
Urutan rentang yang tumpang-tindih#
Perilaku case pertama yang cocok menjadikan urutan klausa bagian dari logika program. Apabila rentang yang lebih luas dituliskan lebih dahulu, rentang yang lebih sempit di bawahnya tidak pernah terjangkau. Kode berikut selalu mencetak ruang serbaguna untuk nilai 120 karena Case Is >= 20 dicocokkan lebih dahulu.
' tidak-dijalankan
' Case yang lebih luas dituliskan lebih dahulu sehingga auditorium tidak pernah terpilih
Select Case jumlah
Case Is >= 20
Console.WriteLine("Gunakan ruang serbaguna")
Case Is >= 100
Console.WriteLine("Gunakan auditorium")
End SelectPerbaikannya adalah menuliskan pembanding dengan batas paling tinggi terlebih dahulu, atau menggunakan rentang To yang tidak tumpang-tindih seperti pada contoh konversi nilai.
Case Else yang menelan nilai tidak valid#
Apabila huruf E hanya diletakkan pada Case Else tanpa rentang 0 sampai 59 yang eksplisit, nilai -3 dan 150 sama-sama menerima huruf E seolah-olah keduanya data yang sah. Konversi nilai pada bagian struktur menghindari hal ini dengan menuliskan Case 0 To 59 secara eksplisit, sehingga Case Else hanya menerima kejanggalan seperti nilai negatif atau di atas 100.
Kondisi lintas variabel pada Select Case#
Select Case menguji satu ekspresi, sehingga keputusan yang menggabungkan dua variabel berbeda tidak dapat dituliskan sebagai klausa Case. Percobaan mencocokkan rentang dua variabel dalam satu Select Case justru mencocokkan variabel uji yang sama dengan kedua rentang itu. Kondisi semacam ini dituliskan dengan If/ElseIf dan AndAlso, atau dengan Select Case yang ditumpuk di dalam blok case.
Ringkasan#
- Select Case mengevaluasi satu ekspresi satu kali, mencocokkannya dari atas ke bawah, dan menjalankan hanya blok case pertama yang cocok.
- Klausa Case menerima nilai tunggal, daftar yang dipisah koma, rentang dengan To, serta pembanding dengan Is yang boleh ditiadakan.
- Case Else menangkap sisa nilai yang tidak cocok dan sebaiknya hanya menerima kejanggalan data.
- Select Case dipilih untuk satu ekspresi dengan banyak nilai, sedangkan If/ElseIf dipilih untuk kondisi lintas variabel.
Referensi#
- Select…Case Statement — Microsoft Learn — Bentuk klausa Case, Case Else, dan perilaku case pertama yang cocok.
- Control Flow in Visual Basic — Microsoft Learn — Ikhtisar struktur kendali pada Visual Basic, termasuk posisi Select Case di dalamnya.