Statement goto adalah perangkat lompatan paling primitif di C#: eksekusi berpindah langsung ke baris yang ditandai label. Hampir seluruh kebutuhan lompatan modern sudah dijawab if, loop, break, continue, dan return, sehingga goto tersisa untuk kasus yang sangat terbatas. Chapter ini membahas sintaksnya, satu kasus yang masih wajar, serta alasan penggunaannya dihindari untuk kebutuhan sehari-hari.
Sintaks Goto dan Label #
Label ditulis sebagai satu kata diikuti titik dua, dan goto <label> memerintahkan eksekusi melompat ke sana. Label memiliki cakupan seluruh method, sehingga goto boleh melompat ke atas maupun ke bawah di dalam method yang sama.
bool kondisi = false;
Console.WriteLine("Langkah 1");
if (kondisi)
{
goto akhir;
}
Console.WriteLine("Langkah 2");
akhir:
Console.WriteLine("Langkah terakhir");Output yang Dihasilkan:
Langkah 1
Langkah 2
Langkah terakhirKarena kondisi bernilai false, perintah goto akhir tidak dijalankan dan program memproses semua langkah secara berurutan. Bila kondisi diubah menjadi true, baris Langkah 2 akan dilewati karena eksekusi melompat langsung ke label akhir. Compiler juga menolak goto yang menunjuk label yang tidak ada, sehingga lompatan yang rusak terdeteksi saat kompilasi.
Kasus yang Masih Wajar: Keluar dari Nested Loop #
Statement break hanya mengakhiri loop terdalam yang membungkusnya. Untuk keluar dari dua loop atau lebih sekaligus, goto ke label di luar loop menjadi jalan keluar yang sah dan terbaca.
for (int baris = 1; baris <= 5; baris++)
{
for (int kolom = 1; kolom <= 5; kolom++)
{
if (baris * kolom > 12)
{
Console.WriteLine($"Ditemukan di baris {baris}, kolom {kolom}");
goto selesai;
}
}
}
Console.WriteLine("Nilai tidak ditemukan");
selesai:
Console.WriteLine("Pencarian dihentikan");Output yang Dihasilkan:
Ditemukan di baris 3, kolom 5
Pencarian dihentikanMari kita telaah baris demi baris:
- Baris 1–3: Dua loop bersarang menelusuri kombinasi
baris × kolomdari 1 sampai 5. - Baris 5 (
if (baris * kolom > 12)): Kondisi memeriksa apakah hasil perkalian pertama kali melebihi12. - Baris 7: Kombinasi
3 × 5merupakan kombinasi pertama yang memenuhi syarat, lalu pesannya dicetak. - Baris 8 (
goto selesai): Eksekusi melompat keluar dari kedua loop sekaligus menuju label di baris 15. - Baris 13: Baris ini dilewati seluruhnya karena pencarian berhasil; bila tidak ada kombinasi yang cocok, baris inilah yang tercetak sebelum eksekusi sampai ke label.
Mengapa Goto Jarang Dipakai #
Lompatan bebas membuat alur program sulit dilacak: pembaca kode harus mencari posisi label untuk mengetahui ke mana eksekusi berpindah. Kode yang bergantung pada goto juga sulit direstrukturisasi, karena label dan lompatannya mudah tercecer saat bagian kode dipindahkan. Alternatif tanpa goto pun tersedia, misalnya variabel flag atau memindahkan loop ke method terpisah dengan return. Karena itu, gunakan goto hanya untuk kasus keluar nested loop seperti di atas, dan pilih struktur kendali lain untuk seluruh kebutuhan lainnya.