Dua sen saya pada kata kunci hasil di C #

Kata kunci hasil, pertama kali diperkenalkan di C # 2.0, T mengembalikan objek yang mengimplementasikan antarmuka IEnumerable. Antarmuka IEnumerable memperlihatkan IEnumerator yang dapat digunakan untuk mengulang koleksi non-generik menggunakan foreach loop di C #. Anda dapat menggunakan kata kunci hasil untuk menunjukkan bahwa metode atau aksesor yang digunakan adalah iterator.

Ada dua cara untuk menggunakan kata kunci hasil: Menggunakan pernyataan "hasil kembali" dan "jeda hasil". Sintaks keduanya ditampilkan di bawah ini.

yield return ;

yield break;

Mengapa saya harus menggunakan kata kunci hasil?

Kata kunci hasil dapat melakukan iterasi penuh keadaan tanpa perlu membuat koleksi sementara. Dengan kata lain, saat menggunakan pernyataan "yield return" di dalam iterator, Anda tidak perlu membuat koleksi sementara untuk menyimpan data sebelum dikembalikan. Anda dapat memanfaatkan pernyataan yield return untuk mengembalikan setiap elemen dalam koleksi satu per satu, dan Anda dapat menggunakan pernyataan "yield return" dengan iterator dalam metode atau get accessor.

Perhatikan bahwa kontrol dikembalikan ke pemanggil setiap kali pernyataan "hasil pengembalian" ditemukan dan dijalankan. Yang terpenting, dengan setiap panggilan tersebut, informasi status callee dipertahankan sehingga eksekusi dapat dilanjutkan segera setelah pernyataan hasil saat kontrol kembali.

Mari kita lihat contohnya. Potongan kode berikut menggambarkan bagaimana kata kunci hasil dapat digunakan untuk mengembalikan angka Fibonacci. Metode ini menerima bilangan bulat sebagai argumen yang mewakili hitungan angka Fibonacci yang akan dihasilkan.

static IEnumerable GenerateFibonacciNumbers(int n)

       {

           for (int i = 0, j = 0, k = 1; i < n; i++)

          {

               yield return j;

               int temp = j + k;

               j = k;

               k = temp;

           }

       }

Seperti yang ditunjukkan pada cuplikan kode di atas, pernyataan "yield return j;" mengembalikan angka Fibonacci satu per satu tanpa keluar dari loop "for". Dengan kata lain, informasi negara dipertahankan. Inilah bagaimana metode GenerateFibonacciNumbers dapat dipanggil.

foreach (int x in GenerateFibonacciNumbers(10))

   {

       Console.WriteLine(x);

   }

Seperti yang Anda perhatikan, tidak perlu membuat daftar atau larik perantara untuk menyimpan nomor fibonacci yang perlu dibuat dan dikembalikan ke pemanggil.

Perhatikan bahwa di bawah sampul kata kunci hasil membuat mesin negara untuk memelihara informasi negara. MSDN menyatakan: "Ketika pernyataan pengembalian hasil dicapai dalam metode iterator, ekspresi dikembalikan, dan lokasi saat ini dalam kode dipertahankan. Eksekusi dimulai ulang dari lokasi itu saat berikutnya fungsi iterator dipanggil."

Keuntungan lain menggunakan kata kunci hasil adalah item yang dikembalikan dibuat hanya berdasarkan permintaan. Sebagai contoh, berikut ini get accessor mengembalikan bilangan genap antara 1 dan 10.

public static IEnumerable EvenNumbers

       {

           Dapatkan

           {

               untuk (int i = 1; i <= 10; i ++)

               {

                   jika ((i% 2) == 0)

                   yield return i;

               }

           }

       }

Anda dapat mengakses properti statis EvenNumbers untuk menampilkan bilangan genap antara 1 dan 10 di jendela konsol menggunakan cuplikan kode yang diberikan di bawah ini.

foreach (int i in EvenNumbers)

     {

         Console.WriteLine(i);

     }

Anda dapat menggunakan pernyataan "yield break" dalam iterator saat tidak ada lagi nilai yang akan dikembalikan. Pernyataan "yield break" digunakan untuk menghentikan pencacahan.

public IEnumerable GetData(IEnumerable items)

{

   if (null == items)

       yield break;

   foreach (T item in items)

       yield return item;

}

Lihat daftar kode di atas. Perhatikan bagaimana pemeriksaan dilakukan untuk melihat apakah parameter "item" adalah null. Ketika Anda memanggil metode GetData () dalam iterator dan dengan parameter null sebagai, kontrol hanya kembali ke pemanggil tanpa nilai yang dikembalikan.

Poin yang perlu diingat

Saat bekerja dengan kata kunci hasil, Anda harus memperhatikan hal-hal berikut:

  • Anda tidak dapat memiliki pernyataan pengembalian hasil dalam blok coba-tangkap meskipun Anda dapat memilikinya di dalam blok coba-akhirnya
  • Anda tidak dapat memiliki pernyataan yield break di dalam blok akhirnya
  • Jenis pengembalian dari metode di mana hasil telah digunakan, harus IEnumerable, IEnumerable, IEnumerator, atau IEnumerator
  • Anda tidak dapat memiliki parameter ref atau out dalam metode Anda di mana hasil telah digunakan
  • Anda tidak dapat menggunakan pernyataan "yield return" atau "yield break" di dalam metode anonim
  • Anda tidak dapat menggunakan pernyataan "yield return" atau "yield break" di dalam metode "tidak aman", yaitu metode yang ditandai dengan kata kunci "tidak aman" untuk menunjukkan konteks yang tidak aman