Какой способ возврата оболочки только для чтения 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>, это обеспечивает безопасную оболочку вокруг ваших объектов, при этом все еще гибкая и эффективная, и предотвращая возможность отбрасывания заданные значения.

Вы всегда можете изменить внутреннюю реализацию позже, если решите, что вам нужно сделать что-то другое в результатах.