Подтвердить что ты не робот

Содержит ли Collection <T> IList <T> или перечислит IList <T>?

Если я выставляю внутренний член через свойство Collection через:

public Collection<T> Entries
{
    get { return new Collection<T>(this.fieldImplimentingIList<T>); }
}

Когда это свойство называется тем, что происходит? Например, что происходит, когда вызываются следующие строки кода:

T test = instanceOfAbove.Entries[i];
instanceOfAbove[i] = valueOfTypeT;

Ясно, что каждый раз, когда это свойство называется новым ссылочным типом, создается, но что происходит? Оставляет ли он просто IList<T> под ним, перечисляет ли он по IList<T> и создает новый экземпляр Collection<T>? Я обеспокоен производительностью, если это свойство используется в цикле for.

4b9b3361

Ответ 1

Согласно Reflector, новый Collection<T> просто обертывает IList<T>:

public Collection(IList<T> list)
{
    if (list == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list);
    }
    this.items = list;
}

И из документы:

Инициализирует новый экземпляр класса Collection < (Of < (T > ) > ) в качестве обертки для указанного списка.

(выделено курсивом)

Таким образом, накладные расходы минимальны (список не перечисляется), а изменения в возвращенной коллекции будут влиять на исходный список.

(Кстати, я предполагаю, что вы ссылаетесь на System.Collections.ObjectModel.Collection<T> - в верхнем уровне System.Collections нет пространственной версии Collection в.)

Ответ 2

В соответствии с Reflector - вот конструктор коллекции:

public Collection(IList<T> list)
{
    if (list == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list);
    }
    this.items = list;
}

Итак, вы можете видеть, что Collection wraps IList и никакие данные не копируются.