break menghentikan loop lebih awal. continue melewati sisa iterasi saat ini dan pindah ke iterasi berikutnya. Keduanya berlaku untuk loop terdalam yang melingkupinya, dan cara kerjanya sama di for, foreach, while, dan do while.
Output:
process order of 45
skip invalid total 0
process order of 120
skip invalid total -5
process order of 80
test order found, stopping
after the loop
continue melompati baris pemrosesan untuk 0 dan -5. break menghentikan loop di 999, jadi 60 tidak pernah dikunjungi, dan eksekusi berlanjut di pernyataan pertama setelah loop.
break: berhenti saat jawabannya sudah ditemukan
Penggunaan khas break adalah pencarian: begitu kamu menemukan yang dicari, tidak ada alasan untuk memeriksa sisanya.
Output:
first invalid email at index 1
Bagian iterator (i++) tidak dijalankan setelah break, jadi i masih akan menyimpan index yang cocok kalau variabel itu dideklarasikan di luar loop. Untuk pencarian sederhana, method library menyatakan hal yang sama: Array.FindIndex(emails, e => !e.Contains("@")) mengembalikan index-nya (atau -1), dan emails.Any(e => !e.Contains("@")) dari LINQ menjawab apakah ada email yang tidak valid.
continue: lompat ke iterasi berikutnya
continue adalah guard clause untuk loop. Alih-alih membungkus pekerjaan utama di dalam if, tolak kasus yang tidak kamu inginkan di bagian atas:
Output:
pen costs 1.20
mug costs 8.00
Ke mana continue melompat bergantung pada jenis loop-nya. Di for loop, ia menjalankan bagian iterator lalu menguji kondisinya. Di while loop, ia langsung melompat ke kondisi, dan ini memicu bug klasik:
int i = 0;
while (i < 10)
{
if (i % 2 == 0)
continue; // i++ below is skipped: i stays 0 forever
Console.WriteLine(i);
i++;
}
Perbarui counter sebelum continue mana pun, atau pakai for loop, yang bagian update-nya ada di header dan selalu dijalankan.
break di dalam switch di dalam loop
Di dalam switch, break mengakhiri bagian case. Saat switch itu berada di dalam loop, break tersebut milik switch, bukan milik loop:
Output:
quit received
count = 2
break biasa di case "quit" hanya akan mengakhiri switch, loop akan terus berjalan, dan count akan bernilai 3. goto melompat ke label setelah loop. Memindahkan loop ke sebuah method dan menulis return di case itu juga berfungsi, dan tidak butuh label.
Keluar dari nested loop
C# tidak punya break berlabel seperti break outer; di Java. Saat sebuah pencarian berjalan di dua loop bersarang, break di loop dalam hanya mengakhiri loop dalam itu; loop luar pindah ke baris berikutnya. Ada tiga solusi standar.
1. Sebuah flag yang dicek oleh loop luar:
Output:
first free seat: row 1, seat 2
2. goto ke sebuah label setelah kedua loop. Inilah satu-satunya tempat banyak panduan gaya C# menerima goto, karena maksudnya persis "keluar dari kedua loop":
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
if (seats[row, col] == 0)
{
Console.WriteLine($"first free seat: row {row}, seat {col}");
goto done;
}
}
}
done:
Console.WriteLine("search finished");
3. Method dengan return, biasanya yang paling rapi, karena pencariannya punya nama dan bisa mengembalikan hasilnya:
Output:
first free seat: row 1, seat 2
C# 7.0 juga memperkenalkan local function, yang memungkinkan kamu menaruh method pembantu itu di dalam method pemanggilnya. Pola out-parameter yang dipakai di sini dijelaskan di halaman ref dan out.
goto dan label
Label adalah identifier yang diikuti titik dua, dan goto label; melompat ke sana. Aturannya cukup ketat untuk mencegah penyalahgunaan terburuk:
- Label harus ada di method yang sama, di blok yang sama dengan
gotoatau blok yang melingkupinya. Kamu bisa melompat keluar dari blok tetapi tidak pernah masuk ke dalamnya: melompat ke label di dalam body loop dari luar menghasilkan error CS0159 (no such label within the scope of the goto statement). - Kamu tidak bisa keluar dari blok
finallydengangoto,break, ataucontinue. - Di dalam
switch,goto case 3;dangoto default;memindahkan kendali ke bagian lain. Begitulah switch di C# menyatakan fall-through, karena jatuh ke case berikutnya secara implisit menghasilkan error saat compile.
goto juga bisa membentuk loop (melompat mundur ke sebuah label), tetapi while loop menyatakan hal yang sama dalam bentuk yang dikenali setiap pembaca. Simpan goto untuk keluar dari nested loop dan untuk bagian switch.
return, throw, dan loop
return keluar dari seluruh method, jadi juga keluar dari setiap loop di dalamnya. throw melakukan hal yang sama dengan memunculkan exception. Di dalam blok try yang punya finally, break, continue, goto, dan return tetap menjalankan blok finally sebelum kendali berpindah, dan inilah yang membuat keluar dari loop yang sedang membuka file di blok using tetap aman.
| Pernyataan | Keluar dari | Berlanjut di |
|---|---|---|
continue | iterasi saat ini | iterasi berikutnya (iterator, lalu kondisi) |
break | loop atau switch terdalam | pernyataan setelahnya |
goto label | blok mana pun yang melingkupinya | label |
return | method | pemanggil |
throw | semuanya sampai catch yang cocok | blok catch |
Pertanyaan yang sering diajukan
Apa bedanya break dan continue di C#?
break langsung menghentikan loop (atau switch) yang paling dalam; eksekusi berlanjut setelahnya. continue hanya menghentikan iterasi saat ini dan melompat ke iterasi berikutnya: di for loop, bagian iterator dijalankan berikutnya; di while dan do while, kondisi diuji berikutnya; di foreach, elemen berikutnya diambil.
Bagaimana cara keluar dari nested loop di C#?
C# tidak punya break berlabel. Tiga pilihannya: set sebuah flag bool dan uji di loop luar, lompati kedua loop dengan goto ke sebuah label, atau pindahkan loop-nya ke sebuah method lalu return dari method itu. Versi method biasanya paling rapi, karena pencariannya juga jadi punya nama dan nilai kembalian.
Apakah break di dalam switch keluar dari loop di C#?
Tidak. Di dalam switch yang berada di dalam loop, break mengakhiri bagian switch dan loop tetap berjalan. Untuk keluar dari loop dari dalam sebuah case, pakai return, flag yang dicek setelah switch, atau goto ke label setelah loop. continue di dalam case memang melompat ke iterasi berikutnya dari loop.
Apakah goto boleh dipakai di C#?
Boleh. goto label; melompat ke label: di method yang sama, tetapi tidak bisa melompat masuk ke dalam sebuah blok atau keluar dari finally. Di dalam switch, goto case value; dan goto default; melompat antarbagian. Selain untuk keluar dari nested loop dan fall-through eksplisit di switch, goto jarang menjadi pilihan yang paling jelas.