Saya telah melihat sintaks ini di MSDN:, yield break
tapi saya tidak tahu apa fungsinya. Apakah ada yang tahu?
494
Saya telah melihat sintaks ini di MSDN:, yield break
tapi saya tidak tahu apa fungsinya. Apakah ada yang tahu?
MyList.Add(...)
lakukan sajayield return ...
. Jika Anda perlu keluar dari lingkaran sebelum waktunya dan mengembalikan daftar dukungan virtual yang Anda gunakanyield break;
Jawaban:
Ini menentukan bahwa sebuah iterator telah berakhir. Anda dapat menganggapnya
yield break
sebagaireturn
pernyataan yang tidak mengembalikan nilai.Misalnya, jika Anda mendefinisikan suatu fungsi sebagai iterator, badan fungsi tersebut mungkin terlihat seperti ini:
Perhatikan bahwa setelah loop telah menyelesaikan semua siklusnya, baris terakhir dijalankan dan Anda akan melihat pesan di aplikasi konsol Anda.
Atau seperti ini dengan
yield break
:Dalam hal ini pernyataan terakhir tidak pernah dieksekusi karena kami meninggalkan fungsinya lebih awal.
sumber
break
bukanyield break
dalam contoh Anda di atas? Compiler tidak mengeluh tentang itu.break
dalam hal ini akan menghentikan loop, tetapi tidak akan membatalkan eksekusi metode, sehingga baris terakhir akan dieksekusi dan "Tidak akan melihat saya teks" akan benar-benar terlihat.NullReferenceException
mendapatkan enumerator dari IEnumerable, sementara dengan hasil istirahat Anda tidak (ada contoh tanpa elemen).yield return x
lansiran kompiler yang Anda inginkan metode ini menjadi gula sintaksis untuk membuatEnumerator
objek. Enumerator ini memiliki metodeMoveNext()
dan propertiCurrent
. MoveNext () mengeksekusi metode sampaiyield return
pernyataan, dan mengubah nilai itu menjadiCurrent
. Waktu berikutnya MoveNext dipanggil, eksekusi berlanjut dari sana.yield break
set Current ke null, menandakan akhir enumerator ini, sehinggaforeach (var x in myEnum())
akan berakhir.Mengakhiri blok iterator (mis. Mengatakan tidak ada lagi elemen dalam IEnumerable).
sumber
yield
kata kunci Anda dapat mengulangi koleksi di kedua arah, apalagi Anda dapat mengambil setiap elemen koleksi berikutnya tidak berturutyield
melakukannya. Saya tidak mengatakan Anda salah, saya mengerti apa yang Anda sarankan; tetapi, secara akademis tidak ada iterator di .NET, hanya enumerator (satu arah, maju) - tidak seperti stdc ++ tidak ada "kerangka kerja iterator generik" yang didefinisikan dalam CTS / CLR. LINQ membantu menutup kesenjangan dengan metode ekstensi yang memanfaatkanyield return
dan juga metode panggilan balik , tetapi mereka adalah metode ekstensi kelas satu, bukan iterator kelas satu. hasilnyaIEnumerable
tidak dapat dengan sendirinya beralih ke arah lain selain meneruskan panggilan.Memberitahu iterator bahwa itu telah mencapai akhir.
Sebagai contoh:
sumber
yield
pada dasarnya membuatIEnumerable<T>
metode berperilaku mirip dengan utas terjadwal kooperatif (bukan preemptively).yield return
seperti utas memanggil fungsi "jadwal" atau "tidur" untuk melepaskan kendali CPU. Sama seperti utas,IEnumerable<T>
metode ini mendapatkan kembali kontrol pada titik segera sesudahnya, dengan semua variabel lokal memiliki nilai yang sama seperti sebelumnya sebelum kontrol dilepaskan.yield break
seperti sebuah utas yang mencapai akhir fungsinya dan berakhir.Orang berbicara tentang "mesin negara", tetapi mesin negara adalah semua "utas" sebenarnya. Sebuah thread memiliki beberapa status (yaitu, nilai variabel lokal), dan setiap kali dijadwalkan, diperlukan beberapa tindakan untuk mencapai status baru. Poin utama tentang itu
yield
adalah, tidak seperti utas sistem operasi yang biasa kita gunakan, kode yang menggunakannya membeku dalam waktu hingga iterasi secara manual dimajukan atau diakhiri.sumber
Seluruh subjek blok iterator tercakup dengan baik dalam bab sampel gratis ini dari buku Jon Skeet C # in Depth .
sumber
The
yield break
pernyataan menyebabkan pencacahan berhenti. Akibatnya,yield break
menyelesaikan enumerasi tanpa mengembalikan item tambahan.Pertimbangkan bahwa sebenarnya ada dua cara agar metode iterator dapat menghentikan iterasi. Dalam satu kasus, logika metode secara alami dapat keluar dari metode setelah mengembalikan semua item. Berikut ini sebuah contoh:
Dalam contoh di atas, metode iterator secara alami akan berhenti mengeksekusi setelah
maxCount
bilangan prima ditemukan.The
yield break
Pernyataan adalah cara lain untuk iterator untuk berhenti pencacahan. Ini adalah cara untuk keluar dari pencacahan lebih awal. Berikut adalah metode yang sama seperti di atas. Kali ini, metode ini memiliki batasan jumlah waktu yang dapat dieksekusi oleh metode tersebut.Perhatikan panggilan untuk
yield break
. Akibatnya, ia keluar dari enumerasi awal.Perhatikan juga bahwa
yield break
kerjanya berbeda dari sekadar dataranbreak
. Pada contoh di atas,yield break
keluar dari metode tanpa membuat panggilan keDebug.WriteLine(..)
.sumber
Di sini http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ adalah contoh yang sangat baik:
dan penjelasan, bahwa jika suatu
yield break
pernyataan mengenai suatu metode, eksekusi metode itu berhenti tanpa hasil. Ada beberapa situasi waktu, ketika Anda tidak ingin memberikan hasil apa pun, maka Anda dapat menggunakan hasil istirahat.sumber
yield break hanyalah cara untuk mengatakan pengembalian untuk yang terakhir kalinya dan tidak mengembalikan nilai apa pun
misalnya
sumber
Jika apa yang Anda maksud dengan "apa yang benar-benar dilakukan penghancuran hasil", adalah "bagaimana cara kerjanya" - Lihat blog Raymond Chen untuk detail https://devblogs.microsoft.com/oldnewthing/20080812-00/?p=21273
C # iterators menghasilkan beberapa kode yang sangat rumit.
sumber
Kata kunci hasil digunakan bersama dengan kata kunci kembali untuk memberikan nilai pada objek enumerator. hasil pengembalian menentukan nilai, atau nilai, dikembalikan. Ketika pernyataan pengembalian hasil tercapai, lokasi saat ini disimpan. Eksekusi dimulai kembali dari lokasi ini pada saat iterator dipanggil.
Untuk menjelaskan artinya menggunakan contoh:
Nilai yang dikembalikan saat ini diulang adalah: 0, 2, 5.
Penting untuk dicatat bahwa variabel penghitung dalam contoh ini adalah variabel lokal. Setelah iterasi kedua yang mengembalikan nilai 2, iterasi ketiga dimulai dari tempat sebelumnya, sambil mempertahankan nilai sebelumnya dari variabel lokal bernama penghitung yang 2.
sumber
yield break
terjadiyield return
sebenarnya mendukung pengembalian beberapa nilai. Mungkin bukan itu yang sebenarnya Anda maksudkan, tapi begitulah cara saya membacanya.yield break
adalah karena ia tidak mengandung enumerator tingkat bahasa seperti aforeach
- saat menggunakan enumerator,yield break
nilai sebenarnya yang diberikan. contoh ini terlihat seperti loop yang tidak terbuka. Anda hampir tidak akan pernah melihat kode ini di dunia nyata (kita semua dapat memikirkan beberapa kasus tepi, tentu saja) juga, tidak ada "iterator" di sini. "blok iterator" tidak dapat melampaui metode sebagai masalah spesifikasi bahasa. apa yang sebenarnya dikembalikan adalah "enumerable", lihat juga: stackoverflow.com/questions/742497/…