Содержит ли 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
.
Ответы
Ответ 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 и никакие данные не копируются.