Ini adalah kata kunci C # hasilkan dalam tindakan - tidak melakukan sesuatu yang khusus dengan wwwobjek, 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 returnpernyataan, 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
MoveNextiterator untuk mendapatkan nilai pertama dalam urutan. Hal ini menyebabkan metode untuk mengeksekusi hingga yeild returnpernyataan pertama , di mana penelepon melanjutkan (dan mungkin Unity melanjutkan untuk membuat sisa frame)
- Seperti yang saya pahami, Unity biasanya kemudian memanggil
MoveNextmetode pada iterator sekali setiap frame berikutnya, menyebabkan metode untuk mengeksekusi kembali hingga yield returnpernyataan berikutnya sekali setiap frame, sampai akhir metode atau yield breakpernyataan 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, WWWkelas 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 - yieldkata kunci tidak melakukan sesuatu yang istimewa untuk WWWkelas, melainkan penanganan khusus yang diberikan Unity kepada anggota enumerasi yang dikembalikan yang menyebabkan perilaku ini.
Perbarui yang kedua: Adapun mekanisme yang WWWdigunakan 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 returnuntuk operasi asinkron adalah hack. Dalam program C # "nyata", Anda akan menggunakan aTaskuntuk ini. Unity mungkin tidak menggunakan mereka karena itu dibuat sebelum. Net 4.0, ketikaTaskdiperkenalkan.