Pernyataan perulangan - for
, , foreach
, do
dan while
Pernyataan perulangan berulang kali menjalankan pernyataan atau blok pernyataan. Pernyataan menjalankan for
isinya sementara ekspresi Boolean tertentu mengevaluasi ke true
. Pernyataan ini foreach
menghitung elemen koleksi dan mengeksekusi isinya untuk setiap elemen koleksi. Pernyataan secara do
kondisional mengeksekusi isinya satu atau beberapa kali. Pernyataan ini while
secara kondisional mengeksekusi nol isinya atau lebih kali.
Pada titik mana pun dalam isi pernyataan iterasi, Anda dapat keluar dari perulangan menggunakan break
pernyataan . Anda dapat melangkah ke iterasi berikutnya dalam perulangan menggunakan continue
pernyataan .
Pernyataan for
Pernyataan for
menjalankan pernyataan atau blok pernyataan sementara ekspresi Boolean yang ditentukan bernilai true
. Contoh berikut menunjukkan pernyataan for
yang menjalankan isinya saat penghitung bilangan bulat kurang dari tiga:
for (int i = 0; i < 3; i++)
{
Console.Write(i);
}
// Output:
// 012
Contoh sebelumnya menunjukkan elemen pernyataan for
:
Bagian penginisialisasi yang dijalankan hanya sekali, sebelum memasuki perulangan. Biasanya, Anda mendeklarasikan dan menginisialisasi variabel perulangan lokal di bagian tersebut. Variabel yang dideklarasikan tidak dapat diakses dari luar pernyataan
for
.Bagian penginisialisasi dalam contoh sebelumnya mendeklarasikan dan menginisialisasi variabel penghitung bilangan bulat:
int i = 0
Bagian kondisi yang menentukan apakah perulangan berikutnya dalam perulangan harus dijalankan. Jika dievaluasi ke
true
atau tidak ada, iterasi berikutnya dijalankan; jika tidak, perulangan akan keluar. Bagian kondisi harus berupa ekspresi Boolean.Bagian kondisi dalam contoh sebelumnya memeriksa apakah nilai penghitung kurang dari tiga:
i < 3
Bagian iterator yang menentukan apa yang terjadi setelah setiap eksekusi isi perulangan.
Bagian iterator dalam contoh sebelumnya menambah penghitung:
i++
Isi perulangan, yang harus berupa pernyataan atau blok pernyataan.
Bagian iterator dapat berisi nol atau lebih ekspresi pernyataan berikut, dipisahkan dengan koma:
- ekspresi penambahan prefiks atau postfix, seperti
++i
ataui++
- ekspresi pengurangan prefiks atau postfix, seperti
--i
ataui--
- penugasan
- pemanggilan sebuah metode
- Ekspresi
await
- pembuatan objek dengan menggunakan
new
operator
Jika Anda tidak mendeklarasikan variabel perulangan di bagian penginisialisasi, Anda juga dapat menggunakan nol atau lebih ekspresi dari daftar sebelumnya di bagian penginisialisasi. Contoh berikut menunjukkan beberapa penggunaan bagian penginisialisasi dan iterator yang kurang umum: menetapkan nilai ke variabel eksternal di bagian penginisialisasi, memanggil metode di bagian penginisialisasi dan iterator, dan mengubah nilai dua variabel di bagian iterator:
int i;
int j = 3;
for (i = 0, Console.WriteLine($"Start: i={i}, j={j}"); i < j; i++, j--, Console.WriteLine($"Step: i={i}, j={j}"))
{
//...
}
// Output:
// Start: i=0, j=3
// Step: i=1, j=2
// Step: i=2, j=1
Semua bagian dari pernyataan for
bersifat opsional. Misalnya, kode berikut menentukan perulangan for
tak terbatas:
for ( ; ; )
{
//...
}
Pernyataan foreach
Pernyataan foreach
menjalankan pernyataan atau blok pernyataan untuk setiap elemen dalam contoh jenis yang menerapkan antarmuka System.Collections.IEnumerable atau System.Collections.Generic.IEnumerable<T>, seperti yang ditunjukkan contoh berikut:
List<int> fibNumbers = new() { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibNumbers)
{
Console.Write($"{element} ");
}
// Output:
// 0 1 1 2 3 5 8 13
Pernyataan foreach
tidak terbatas pada jenis tersebut. Anda dapat menggunakannya dengan instans jenis apa pun yang memenuhi kondisi berikut:
- Jenis memiliki metode
GetEnumerator
tanpa parameter publik. Metode iniGetEnumerator
bisa menjadi metode ekstensi jenis. - Jenis pengembalian metode
GetEnumerator
memiliki propertiCurrent
publik dan metodeMoveNext
publik tanpa parameter yang jenis pengembaliannya adalahbool
.
Contoh berikut menggunakan pernyataan foreach
dengan instans jenis System.Span<T>, yang tidak menerapkan antarmuka apa pun:
Span<int> numbers = [3, 14, 15, 92, 6];
foreach (int number in numbers)
{
Console.Write($"{number} ");
}
// Output:
// 3 14 15 92 6
Jika properti enumerator Current
mengembalikan nilai pengembalian referensi (ref T
di mana T
adalah jenis elemen koleksi), Anda dapat mendeklarasikan variabel iterasi dengan pengubah ref
atau ref readonly
, seperti yang ditunjukkan contoh berikut:
Span<int> storage = stackalloc int[10];
int num = 0;
foreach (ref int item in storage)
{
item = num++;
}
foreach (ref readonly var item in storage)
{
Console.Write($"{item} ");
}
// Output:
// 0 1 2 3 4 5 6 7 8 9
Jika kumpulan sumber dari pernyataan foreach
kosong, isi dari pernyataan foreach
tidak dijalankan dan dilewati. Jika pernyataan foreach
diterapkan ke null
, NullReferenceException dimunculkan.
await foreach
Anda dapat menggunakan await foreach
pernyataan untuk menggunakan aliran data asinkron, yaitu jenis koleksi yang mengimplementasikan IAsyncEnumerable<T> antarmuka. Setiap perulangan dari perulangan dapat ditangguhkan sementara elemen berikutnya diambil secara tidak sinkron. Contoh berikut menunjukkan cara menggunakan pernyataan await foreach
:
await foreach (var item in GenerateSequenceAsync())
{
Console.WriteLine(item);
}
Anda juga dapat menggunakan pernyataan await foreach
dengan instans jenis apa pun yang memenuhi ketentuan berikut:
- Jenis memiliki metode
GetAsyncEnumerator
tanpa parameter publik. Metode tersebut dapat berupa metode ekstensi jenis. - Jenis pengembalian metode
GetAsyncEnumerator
memiliki propertiCurrent
publik dan metodeMoveNextAsync
publik tanpa parameter yang jenis pengembaliannya adalahTask<bool>
,ValueTask<bool>
, atau jenis yang dapat ditunggu lainnya yang metodeGetResult
awaiter-nya mengembalikan nilaibool
.
Secara default, elemen aliran diproses dalam konteks yang diambil. Jika Anda ingin menonaktifkan pengambilan konteks, gunakan metode ekstensi TaskAsyncEnumerableExtensions.ConfigureAwait. Untuk informasi selengkapnya tentang konteks sinkronisasi dan mengambil konteks saat ini, lihat Menggunakan pola asinkron berbasis Tugas. Untuk informasi selengkapnya tentang aliran asinkron, lihat tutorial Aliran asinkron.
Jenis variabel perulangan
Anda dapat menggunakan kata kunci var
untuk memungkinkan kompilator menyimpulkan jenis variabel perulangan dalam pernyataan foreach
, seperti yang ditunjukkan kode berikut:
foreach (var item in collection) { }
Catatan
Jenis var
dapat disimpulkan oleh pengkompilasi sebagai jenis referensi nullable, tergantung pada apakah konteks sadar null diaktifkan dan apakah jenis ekspresi inisialisasi adalah jenis referensi.
Untuk informasi selengkapnya, lihat Variabel lokal yang ditik secara implisit.
Anda juga dapat secara eksplisit menentukan jenis variabel perulangan, seperti yang ditunjukkan kode berikut:
IEnumerable<T> collection = new T[5];
foreach (V item in collection) { }
Dalam formulir sebelumnya, jenis T
dari elemen kumpulan harus secara implisit atau eksplisit dapat dikonversi menjadi jenis V
dari variabel perulangan. Jika konversi eksplisit dari T
ke V
gagal saat dijalankan, pernyataan foreach
akan memunculkan InvalidCastException. Misalnya, jika T
adalah jenis kelas yang tidak disegel, V
dapat berupa jenis antarmuka apa pun, bahkan yang T
tidak menerapkannya. Saat dijalankan, jenis elemen koleksi mungkin yang berasal dari T
dan benar-benar menerapkan V
. Jika bukan itu masalahnya, InvalidCastException dimunculkan.
Pernyataan do
Pernyataan do
menjalankan pernyataan atau blok pernyataan sementara ekspresi Boolean yang ditentukan bernilai true
. Karena ekspresi tersebut dievaluasi setelah setiap eksekusi perulangan, perulangan do
dijalankan satu kali atau lebih. Perulangan do
berbeda dari perulanganwhile
, yang mengeksekusi nol atau lebih kali.
Contoh berikut menunjukkan penggunaan pernyataan do
:
int n = 0;
do
{
Console.Write(n);
n++;
} while (n < 5);
// Output:
// 01234
Pernyataan while
Pernyataan while
menjalankan pernyataan atau blok pernyataan sementara ekspresi Boolean yang ditentukan bernilai true
. Karena ekspresi tersebut dievaluasi sebelum setiap eksekusi perulangan, perulangan while
dijalankan nol kali atau lebih. Perulangan while
berbeda dari perulangando
, yang mengeksekusi satu atau beberapa kali.
Contoh berikut menunjukkan penggunaan pernyataan while
:
int n = 0;
while (n < 5)
{
Console.Write(n);
n++;
}
// Output:
// 01234
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
Untuk informasi selengkapnya tentang fitur-fitur ini, lihat catatan proposal fitur berikut ini: