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