более современное решение
, Если Вам не нужен внутренний набор, чтобы быть изменяемыми, Вы могли использовать System.Collections.Immutable
пакет, изменить свой тип поля, чтобы быть неизменным набором и затем выставить это непосредственно - принятие Foo
само неизменно, конечно.
Обновленный ответ для рассматривания вопроса более непосредственно
Является там какой-либо причиной выставить внутренний набор как ReadOnlyCollection, а не IEnumerable, если код вызова только выполняет итерации по набору?
Это зависит от того, насколько Вы доверяете коду вызова. Если Вы находитесь в полном контроле над всем, что будет когда-либо звонить этому участнику и Вам гарантия , который никогда не будет использовать никакой код:
ICollection evil = (ICollection) bar.Foos;
evil.Add(...);
затем уверенный, никакой вред не будет причинен, если Вы просто возвратите набор непосредственно. Я обычно пытаюсь быть более параноиком, чем это все же.
Аналогично, как Вы говорите: если Вы только [1 110] потребность IEnumerable
, то, почему связь сами с чем-либо более сильным?
Исходный ответ
при использовании.NET 3.5 можно постараться не делать копию , и избегают простого броска при помощи простого вызова для Пропуска:
public IEnumerable Foos {
get { return foos.Skip(0); }
}
(Существует много других опций для обертывания тривиально - хорошая вещь, которая приблизительно Skip
по Выбору/Где - то, что нет никакого делегата для выполнения бессмысленно для каждого повторения.)
, Если Вы не используете.NET 3.5, можно записать очень простую обертку, чтобы сделать то же самое:
public static IEnumerable Wrapper(IEnumerable source)
{
foreach (T element in source)
{
yield return element;
}
}
Вместо Action я использую EventHandler
для любых объявлений событий. Это избавляет меня от необходимости определять собственный тип делегата. Он также имеет дополнительное преимущество, заставляя тип данных быть производным от System.EventArgs и, следовательно, хорошо работает с шаблонами событий .Net.