Pernyataan perulangan - for, , foreach, dodan 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:

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 = [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 ini GetEnumerator bisa menjadi metode ekstensi jenis.
  • Jenis pengembalian metode GetEnumerator memiliki properti Current publik dan metode MoveNext publik tanpa parameter yang jenis pengembaliannya adalah bool.

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 properti Current publik dan metode MoveNextAsync publik tanpa parameter yang jenis pengembaliannya adalah Task<bool>, ValueTask<bool>, atau jenis yang dapat ditunggu lainnya yang metode GetResult awaiter-nya mengembalikan nilai bool.

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:

Lihat juga