Більш сучасне рішення
Якщо вам не потрібна внутрішня колекція, щоб бути незмінною, ви можете використовувати System.Collections.Immutable
пакет, змінити тип поля, щоб бути незмінною колекцією, а потім викрити це безпосередньо - якщо вважати Foo
себе непорушним, звичайно.
Оновлена відповідь, щоб вирішити це питання безпосередньо
Чи є якісь підстави виставляти внутрішню колекцію як ReadOnlyCollection, а не IEnumerable, якщо код, що викликає, лише ітерацію над колекцією?
Це залежить від того, наскільки ви довіряєте коду виклику. Якщо ви повністю контролюєте все, що коли-небудь дзвонить цьому учаснику, і ви гарантуєте, що жоден код ніколи не використовуватиме:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
то впевнений, ніякої шкоди не буде, якщо ви просто повернете колекцію безпосередньо. Я, як правило, намагаюся бути трохи більше параноїком, ніж це.
Так само, як ви кажете: якщо вам тільки потрібно IEnumerable<T>
, то навіщо прив’язувати себе до чогось сильнішого?
Оригінальна відповідь
Якщо ви використовуєте .NET 3.5, ви можете уникнути створення копії та уникнути простого перенесення, використовуючи простий виклик для пропуску:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Існує безліч інших варіантів для завершення тривіального завершення - приємна річ щодо Skip
Over / Select, де немає делегата, який би безглуздо виконувався для кожної ітерації.)
Якщо ви не використовуєте .NET 3.5, ви можете написати просту обгортку, щоб зробити те саме:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
якщо ви параноїк, але тепер ви не прив'язані до конкретної реалізації.