Dua sen saya pada kata kunci hasil dalam C #

Kata kunci hasil, pertama kali diperkenalkan dalam C # 2.0, T mengembalikan objek yang menerapkan antara muka IEnumerable. Antara muka IEnumerable memperlihatkan IEnumerator yang dapat digunakan untuk mengulangi koleksi non-generik menggunakan gelung foreach di C #. Anda boleh menggunakan kata kunci hasil untuk menunjukkan bahawa kaedah atau aksesor yang digunakan untuk digunakan adalah iterator.

Terdapat dua cara di mana anda dapat menggunakan kata kunci hasil: Menggunakan pernyataan "hasil pulangan" dan "hasil hasil". Sintaks kedua-duanya ditunjukkan di bawah.

yield return ;

yield break;

Mengapa saya mesti menggunakan kata kunci hasil?

Kata kunci hasil dapat melakukan iterasi penuh tanpa perlu membuat koleksi sementara. Dengan kata lain, apabila menggunakan pernyataan "hasil kembali" di dalam iterator, anda tidak perlu membuat koleksi sementara untuk menyimpan data sebelum dikembalikan. Anda boleh memanfaatkan pernyataan pengembalian hasil untuk mengembalikan setiap elemen dalam koleksi satu per satu, dan anda boleh menggunakan pernyataan "hasil kembali" dengan iterator dalam kaedah atau mendapatkan aksesor.

Perhatikan bahawa kawalan dikembalikan kepada pemanggil setiap kali pernyataan "hasil pulangan" ditemui dan dilaksanakan. Yang paling penting, dengan setiap panggilan tersebut, maklumat keadaan pemanggil disimpan sehingga pelaksanaan dapat diteruskan segera setelah pernyataan hasil ketika kawalan kembali.

Mari lihat contohnya. Coretan kod berikut menggambarkan bagaimana kata kunci hasil boleh digunakan untuk mengembalikan nombor Fibonacci. Kaedah ini menerima bilangan bulat sebagai argumen yang mewakili kiraan nombor 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 dalam coretan kod di atas, pernyataan "hasil pulangan j;" mengembalikan nombor Fibonacci satu persatu tanpa keluar dari gelung "untuk". Dengan kata lain, maklumat keadaan terpelihara. Inilah cara kaedah GenerateFibonacciNumbers boleh dipanggil.

foreach (int x in GenerateFibonacciNumbers(10))

   {

       Console.WriteLine(x);

   }

Seperti yang anda perhatikan, tidak perlu membuat senarai atau susunan pertengahan untuk menyimpan nombor fibonacci yang perlu dihasilkan dan dikembalikan kepada pemanggil.

Perhatikan bahawa di bawah sampul kata kunci hasil membuat mesin keadaan untuk mengekalkan maklumat keadaan. MSDN menyatakan: "Apabila pernyataan pulangan hasil dicapai dalam kaedah iterator, ekspresi dikembalikan, dan lokasi saat ini dalam kod dipertahankan. Pelaksanaan dimulakan semula dari lokasi itu pada saat fungsi iterator dipanggil."

Kelebihan lain dari menggunakan kata kunci hasil adalah bahawa item yang dikembalikan dibuat hanya berdasarkan permintaan. Sebagai contoh, accessor berikut mengembalikan nombor genap antara 1 dan 10.

public static IEnumerable EvenNumbers

       {

           dapatkan

           {

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

               {

                   jika ((i% 2) == 0)

                   pulangan hasil i;

               }

           }

       }

Anda boleh mengakses sifat statik EvenNumbers untuk memaparkan nombor genap antara 1 dan 10 di tetingkap konsol menggunakan coretan kod yang diberikan di bawah.

foreach (int i in EvenNumbers)

     {

         Console.WriteLine(i);

     }

Anda boleh menggunakan pernyataan "jeda hasil" dalam iterator apabila tidak ada lagi nilai yang akan dikembalikan. Pernyataan "jeda hasil" digunakan untuk menghentikan penghitungan.

public IEnumerable GetData(IEnumerable items)

{

   if (null == items)

       yield break;

   foreach (T item in items)

       yield return item;

}

Rujuk senarai kod di atas. Perhatikan bagaimana pemeriksaan dibuat untuk melihat apakah parameter "item" adalah nol. Apabila anda menggunakan kaedah GetData () dalam iterator dan dengan parameter null sebagai, kawalan hanya kembali ke pemanggil tanpa nilai dikembalikan.

Perkara yang perlu diingat

Semasa menggunakan kata kunci hasil, anda harus ingat perkara ini:

  • Anda tidak boleh mempunyai pernyataan hasil hasil dalam blok cubaan tangkapan walaupun anda boleh memilikinya di dalam blok percubaan akhirnya
  • Anda tidak boleh mempunyai pernyataan pemecahan hasil dalam blok akhirnya
  • Jenis pengembalian kaedah di mana hasil telah digunakan, harus IEnumerable, IEnumerable, IEnumerator, atau IEnumerator
  • Anda tidak boleh memiliki parameter ref atau out dalam kaedah Anda di mana hasil telah digunakan
  • Anda tidak boleh menggunakan pernyataan "hasil pulangan" atau "jeda hasil" dalam kaedah tanpa nama
  • Anda tidak boleh menggunakan pernyataan "hasil pulangan" atau "jeda hasil" di dalam kaedah "tidak selamat", iaitu kaedah yang ditandai dengan kata kunci "tidak selamat" untuk menunjukkan konteks yang tidak selamat