Efisiensi
Kata yield
kunci tersebut secara efektif menciptakan penghitungan malas atas item koleksi yang bisa jauh lebih efisien. Misalnya, jika foreach
perulangan Anda hanya mengulangi 5 item pertama dari 1 juta item, maka itu semua yield
pengembalian, dan Anda tidak membangun koleksi 1 juta item secara internal terlebih dahulu. Anda juga ingin menggunakan yield
dengan IEnumerable<T>
nilai pengembalian dalam skenario pemrograman Anda sendiri untuk mencapai efisiensi yang sama.
Contoh efisiensi yang diperoleh dalam skenario tertentu
Bukan metode iterator, potensi penggunaan koleksi besar yang tidak efisien,
(Koleksi perantara dibangun memiliki banyak item)
// Method returns all million items before anything can loop over them.
List<object> GetAllItems() {
List<object> millionCustomers;
database.LoadMillionCustomerRecords(millionCustomers);
return millionCustomers;
}
// MAIN example ---------------------
// Caller code sample:
int num = 0;
foreach(var itm in GetAllItems()) {
num++;
if (num == 5)
break;
}
// Note: One million items returned, but only 5 used.
Versi Iterator, efisien
(Tidak ada koleksi perantara dibangun)
// Yields items one at a time as the caller's foreach loop requests them
IEnumerable<object> IterateOverItems() {
for (int i; i < database.Customers.Count(); ++i)
yield return database.Customers[i];
}
// MAIN example ---------------------
// Caller code sample:
int num = 0;
foreach(var itm in IterateOverItems()) {
num++;
if (num == 5)
break;
}
// Note: Only 5 items were yielded and used out of the million.
Sederhanakan beberapa skenario pemrograman
Dalam kasus lain, ini membuat beberapa jenis penyortiran dan penggabungan daftar lebih mudah diprogram karena Anda hanya yield
memasukkan kembali item dalam urutan yang diinginkan daripada menyortirnya menjadi koleksi perantara dan menukarnya di sana. Ada banyak skenario seperti itu.
Hanya satu contoh adalah penggabungan dua daftar:
IEnumerable<object> EfficientMerge(List<object> list1, List<object> list2) {
foreach(var o in list1)
yield return o;
foreach(var o in list2)
yield return o;
}
Metode ini menghasilkan kembali satu daftar item yang berdekatan, secara efektif penggabungan tanpa koleksi perantara yang diperlukan.
Info lebih lanjut
The yield
kata kunci hanya dapat digunakan dalam konteks metode iterator (memiliki jenis kembalinya IEnumerable
, IEnumerator
, IEnumerable<T>
atau IEnumerator<T>
.) Dan ada hubungan khusus dengan foreach
. Iterator adalah metode khusus. The MSDN dokumentasi hasil dan iterator dokumentasi berisi banyak informasi menarik dan penjelasan tentang konsep-konsep. Pastikan untuk berkorelasi dengan para foreach
kata kunci dengan membaca tentang hal itu juga, untuk melengkapi pemahaman Anda tentang iterator.
Untuk mempelajari tentang bagaimana iterator mencapai efisiensinya, rahasianya ada pada kode IL yang dihasilkan oleh kompiler C #. IL yang dihasilkan untuk metode iterator berbeda secara drastis dari yang dihasilkan untuk metode reguler (non-iterator). Artikel ini (Apa Kata Kunci Hasil Penghasilan yang Sebenarnya?) Memberikan wawasan semacam itu.