Bagikan melalui


Pernyataan perulangan - for, , foreach, dodan while

Pernyataan iterasi secara berulang mengeksekusi sebuah 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 tertentu bernilai true. Contoh berikut menunjukkan for pernyataan yang menjalankan isinya sementara penghitung bilangan bulat kurang dari tiga:

for (int i = 0; i < 3; i++)
{
    Console.Write(i);
}
// Output:
// 012

Contoh sebelumnya menunjukkan elemen for pernyataan:

  • 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 for pernyataan.

    Bagian penginisialisasi dalam contoh sebelumnya menyatakan dan menginisialisasi variabel penghitung bilangan bulat:

    int i = 0
    
  • Bagian kondisi yang menentukan apakah iterasi berikutnya dalam perulangan harus dijalankan. Jika dievaluasi ke true atau tidak ada, iterasi berikutnya dijalankan; jika tidak, perulangan dihentikan. 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 meningkatkan penghitung:

    i++
    
  • Isi perulangan, yang harus menjadi pernyataan atau blok pernyataan.

Bagian iterator dapat berisi nol atau beberapa ekspresi pernyataan berikut, dipisahkan dengan koma:

Jika Anda tidak mendeklarasikan variabel perulangan di bagian inisialisasi, Anda dapat menggunakan nol atau lebih ekspresi dari daftar sebelumnya di bagian inisialisasi juga. Contoh berikut menunjukkan beberapa penggunaan yang kurang umum dari bagian inisialisasi dan iterator: menetapkan nilai ke variabel eksternal di bagian penginisialisasi, memanggil metode di bagian inisialisasi 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 for pernyataan bersifat opsional. Misalnya, kode berikut menentukan perulangan tak terbatas for :

for ( ; ; )
{
    //...
}

Pernyataan foreach

Pernyataan foreach menjalankan pernyataan atau blok pernyataan untuk setiap elemen dalam instans jenis yang mengimplementasikan antarmuka System.Collections.IEnumerable atau System.Collections.Generic.IEnumerable<T>, seperti yang ditunjukkan dalam 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 publik tanpa parameter GetEnumerator. Metode GetEnumerator dapat menjadi metode ekstensi suatu jenis.
  • Jenis pengembalian metode GetEnumerator memiliki properti publik Current dan metode publik MoveNext yang tidak memiliki parameter, yang jenis pengembaliannya adalah bool.

Contoh berikut menggunakan pernyataan foreach dengan instans tipe System.Span<T>, yang tidak mengimplementasikan 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 foreach sumber pernyataan kosong, isi foreach pernyataan tidak dijalankan dan dilewati. foreach Jika pernyataan tersebut diterapkan pada null, maka NullReferenceException akan dilemparkan.

menunggu foreach

Anda dapat menggunakan pernyataan await foreach untuk mengonsumsi aliran data asinkron, yaitu collection type yang mengimplementasikan antarmuka IAsyncEnumerable<T>. Setiap iterasi perulangan dapat ditangguhkan sementara elemen berikutnya diambil secara asinkron. Contoh berikut menunjukkan cara menggunakan await foreach pernyataan:

await foreach (var item in GenerateSequenceAsync())
{
    Console.WriteLine(item);
}

Anda juga dapat menggunakan await foreach pernyataan dengan instans jenis apa pun yang memenuhi kondisi berikut:

  • Jenis memiliki metode publik tanpa parameter GetAsyncEnumerator. Metode itu bisa menjadi jenis metode ekstensi.
  • Jenis pengembalian metode GetAsyncEnumerator memiliki properti publik Current dan metode publik tanpa parameter MoveNextAsync yang jenis pengembaliannya adalah Task<bool>, ValueTask<bool>, atau jenis lain yang dapat ditunggu, di mana metode penanam GetResult mengembalikan nilai bool.

Secara default, elemen stream diproses dalam konteks yang diambil. Jika Anda ingin menonaktifkan pengambilan konteks, gunakan TaskAsyncEnumerableExtensions.ConfigureAwait metode ekstensi. Untuk informasi selengkapnya tentang konteks sinkronisasi dan menangkap 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 var kata kunci untuk membiarkan pengkompilasi menyimpulkan jenis variabel iterasi dalam foreach pernyataan, seperti yang ditunjukkan oleh kode berikut:

foreach (var item in collection) { }

Nota

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 iterasi, seperti yang ditunjukkan oleh kode berikut:

IEnumerable<T> collection = new T[5];
foreach (V item in collection) { }

Dalam bentuk sebelumnya, jenis T elemen koleksi harus secara implisit atau eksplisit dapat dikonversi ke jenis V variabel iterasi. Jika konversi eksplisit dari T ke V gagal pada waktu proses, foreach pernyataan akan melempar InvalidCastException. Misalnya, jika T adalah jenis kelas yang tidak disegel, V dapat berupa jenis antarmuka apa pun, bahkan jenis yang T tidak diterapkan. Pada run time, jenis elemen koleksi mungkin yang berasal dari T dan benar-benar mengimplementasikan V. Jika itu tidak terjadi, InvalidCastException akan dilempar.

Pernyataan do

Pernyataan do menjalankan pernyataan atau blok pernyataan sementara ekspresi Boolean tertentu bernilai true. Karena ekspresi tersebut dievaluasi setelah setiap eksekusi perulangan, perulangan do dijalankan satu atau beberapa kali. Perulangan do berbeda dari perulanganwhile, yang mengeksekusi nol atau lebih kali.

Contoh berikut menunjukkan penggunaan do pernyataan:

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 tertentu bernilai true. Karena ekspresi tersebut dievaluasi sebelum setiap eksekusi perulangan, perulangan while dieksekusi nol kali atau lebih. Perulangan while berbeda dari perulangando, yang mengeksekusi satu atau beberapa kali.

Contoh berikut menunjukkan penggunaan while pernyataan:

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:

Lihat juga