Более современное решение
Если вам не нужно, чтобы внутренняя коллекция была изменяемой, вы можете использовать пакет 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;
}
}
person
Jon Skeet
schedule
29.01.2009
ReadOnlyCollection
, если вы параноик, но теперь вы не привязаны к конкретной реализации. - person StriplingWarrior   schedule 13.11.2012