Solusi yang lebih modern
Kecuali jika Anda memerlukan koleksi internal yang dapat diubah, Anda dapat menggunakan System.Collections.Immutable
paket, mengubah jenis bidang Anda menjadi koleksi yang tidak dapat diubah, dan kemudian mengeksposnya secara langsung - dengan asumsi Foo
itu sendiri tidak dapat diubah, tentu saja.
Jawaban yang diperbarui untuk menjawab pertanyaan secara lebih langsung
Apakah ada alasan untuk mengekspos koleksi internal sebagai ReadOnlyCollection daripada IEnumerable jika kode panggilan hanya mengulang koleksi?
Itu tergantung pada seberapa besar Anda mempercayai kode panggilan. Jika Anda memegang kendali penuh atas semua yang akan memanggil anggota ini dan Anda menjamin bahwa kode tidak akan pernah digunakan:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
Maka pasti, tidak ada salahnya jika Anda langsung mengembalikan koleksinya. Saya biasanya mencoba menjadi sedikit lebih paranoid dari itu.
Demikian juga, seperti yang Anda katakan: jika Anda hanya perlu IEnumerable<T>
, lalu mengapa mengikatkan diri Anda pada sesuatu yang lebih kuat?
Jawaban asli
Jika Anda menggunakan .NET 3.5, Anda dapat menghindari membuat salinan dan menghindari transmisi sederhana dengan menggunakan panggilan sederhana ke Lewati:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Ada banyak opsi lain untuk membungkus secara sepele - hal yang menyenangkan tentang Skip
over Select / Where adalah bahwa tidak ada delegasi yang dieksekusi tanpa tujuan untuk setiap iterasi.)
Jika Anda tidak menggunakan .NET 3.5 Anda dapat menulis pembungkus yang sangat sederhana untuk melakukan hal yang sama:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
jika Anda paranoid, tetapi sekarang Anda tidak terikat pada implementasi tertentu.