Ini adalah kata kunci C # hasilkan dalam tindakan - tidak melakukan sesuatu yang khusus dengan www
objek, melainkan berarti sesuatu yang istimewa untuk metode yang terdapat di dalamnya. Secara khusus kata kunci ini hanya dapat digunakan dalam metode yang mengembalikan IEnumerable
(atau IEnumerator
), dan digunakan untuk menunjukkan objek apa yang akan "dikembalikan" oleh enumerator ketika MoveNext dipanggil.
Ini bekerja karena kompiler mengubah seluruh metode menjadi kelas terpisah yang mengimplementasikan IEnumerable
(atau IEnumerator
) menggunakan mesin negara - hasil akhirnya adalah bahwa tubuh metode itu sendiri tidak dieksekusi sampai seseorang menghitung melalui nilai pengembalian. Ini akan bekerja dengan jenis apa pun, sama sekali tidak ada yang istimewa WWW
, melainkan metode yang mengandung yang khusus.
Lihatlah di balik layar dari kata kunci C # yield untuk beberapa wawasan lebih lanjut tentang jenis kode apa yang dihasilkan oleh kompiler C #, atau hanya bereksperimen dan periksa kodenya sendiri menggunakan sesuatu seperti IL Spy
Pembaruan: Untuk memperjelas
- Ketika Unity memanggil coroutine yang berisi
yield return
pernyataan, semua yang terjadi adalah bahwa enumerator dikembalikan - tidak ada satupun metode yang dieksekusi pada titik ini
- Untuk mendapatkan tubuh metode untuk mengeksekusi Unity harus memanggil
MoveNext
iterator untuk mendapatkan nilai pertama dalam urutan. Hal ini menyebabkan metode untuk mengeksekusi hingga yeild return
pernyataan pertama , di mana penelepon melanjutkan (dan mungkin Unity melanjutkan untuk membuat sisa frame)
- Seperti yang saya pahami, Unity biasanya kemudian memanggil
MoveNext
metode pada iterator sekali setiap frame berikutnya, menyebabkan metode untuk mengeksekusi kembali hingga yield return
pernyataan berikutnya sekali setiap frame, sampai akhir metode atau yield break
pernyataan tercapai (menunjukkan akhir urutan)
Bit hanya khusus disini (dan dalam beberapa dari kasus lain ) adalah bahwa Unity tidak memajukan iterator tertentu frame berikutnya, bukan hanya memajukan iterator (menyebabkan metode untuk terus mengeksekusi) ketika download selesai. Meskipun tampaknya ada kelas YieldInstruction dasar yang mungkin mengandung mekanisme umum untuk pensinyalan ke Unity ketika iterator harus ditingkatkan, WWW
kelas tersebut tampaknya tidak mewarisi dari kelas ini sehingga saya hanya dapat berasumsi bahwa ada kasus khusus untuk kelas ini di mesin Unity.
Hanya untuk memperjelas - yield
kata kunci tidak melakukan sesuatu yang istimewa untuk WWW
kelas, melainkan penanganan khusus yang diberikan Unity kepada anggota enumerasi yang dikembalikan yang menyebabkan perilaku ini.
Perbarui yang kedua: Adapun mekanisme yang WWW
digunakan untuk mengunduh halaman web secara serempak mungkin menggunakan Metode HttpWebRequest.BeginGetResponse yang secara internal akan menggunakan IO yang tidak sinkron atau sebagai alternatifnya dapat menggunakan utas (baik membuat utas khusus atau dengan menggunakan utas thread).
yield return
untuk operasi asinkron adalah hack. Dalam program C # "nyata", Anda akan menggunakan aTask
untuk ini. Unity mungkin tidak menggunakan mereka karena itu dibuat sebelum. Net 4.0, ketikaTask
diperkenalkan.