Какой способ возврата оболочки только для чтения List <T> предпочтительнее?
Скажем, у нас есть общий класс с личным списком.
Мы можем заставить его возвращать обертку только для чтения этого списка, по крайней мере, двумя способами:
public class Test<T>
{
public List<T> list = new List<T>();
public IEnumerable<T> Values1
{
get
{
foreach (T i in list)
yield return i;
}
}
public IEnumerable<T> Values2
{
get
{
return list.AsReadOnly();
}
}
}
Оба Values1
и Values2
отражают любые фрагменты в базовой коллекции и не позволяют им изменять сами.
Каким образом, если это предпочтительнее? О чем следует знать? Или есть другой лучший способ?
Ответы
Ответ 1
Если для вывода требуется только IEnumerable<T>
, я предпочитаю:
public IEnumerable<T> Values
{
return this.list.AsReadOnly();
}
Так как ReadOnlyCollection<T>
реализует IEnumerable<T>
, это обеспечивает безопасную оболочку вокруг ваших объектов, при этом все еще гибкая и эффективная, и предотвращая возможность отбрасывания заданные значения.
Вы всегда можете изменить внутреннюю реализацию позже, если решите, что вам нужно сделать что-то другое в результатах.