Какое преимущество вы получаете с коллекцией над List (Of T) в .NET 2.0+ - PullRequest
8 голосов
/ 30 января 2009

У меня был другой разработчик, спрашивающий, почему я использую List повсеместно ... и я думал об этом минуту ... и не мог придумать окончательный ответ.

Если вы наследуете от базового класса коллекции расширение, а не используете List (Of T) - какие преимущества вы получаете? Или - что вы не получите со списком?

Ответы [ 5 ]

4 голосов
/ 30 января 2009

Общий список дает вам повышение производительности.

Смотрите этот вопрос:

Есть ли у C # Generics преимущество в производительности?

Цитата из MSDN :

В ваших интересах использовать специфичная для типа реализация Список <(Of <(T>)>) вместо класса используя класс ArrayList или запись строго типизированная коллекция обёрток сам . Причина ваша реализация должна делать то, что .NET Framework делает для вас уже, и общеязыковая среда выполнения может делиться Код промежуточного языка Microsoft и метаданные, которые ваши реализация не может.

1 голос
/ 30 января 2009

Типовое приведение стоит времени и предотвращается при использовании дженериков. Если вы используете List (Of T), нет необходимости в приведении типов, потому что это будет строго типизированная коллекция. Если вы используете ArrayList, вы преобразуете объект из Object в свой собственный тип и наоборот, что приводит к дополнительным накладным расходам.

Кроме того, вы предотвращаете проблемы приведения типов, которые вы не можете обнаружить во время компиляции. (Например, добавление int в список массивов, который должен содержать строки, не является проблемой, когда вы используете список массивов, но может вызвать недопустимое выражение, когда вы не ожидаете int во время выполнения. код не скомпилируется.)

Надеюсь, это поможет.

1 голос
/ 30 января 2009

Общий список <> был разработан для скорости и внутреннего использования. Универсальная коллекция <>, с другой стороны, была разработана для расширяемости.

Одним из преимуществ класса Collection <> является то, что вы можете переопределить несколько различных методов (ClearItems (), InsertItem (), RemoveItem () и SetItem ()). С другой стороны, универсальный тип List <> не предоставляет методов, которые могут быть переопределены.

Почему это имеет значение? Скажем, например, что будущие требования требуют, чтобы вы вызывали событие ItemAdded при добавлении элемента в коллекцию. Если бы вы использовали тип List <>, у вас не так много вариантов. Однако если бы вы использовали класс Collection <>, у вас есть возможность открыть новое событие ItemAdded и переопределить метод InsertItem (), чтобы он вызывал событие ItemAdded при добавлении элемента.

1 голос
/ 30 января 2009

Список не является потокобезопасным и не предназначен для раскрытия. Вместо этого вы можете использовать Collection (Of T) (обратите внимание, что это отличается от CollectionBase), или просто выставить IList (Of T) или IEnumerable (Of T).

0 голосов
/ 30 января 2009

Наследование от коллекции (Of T) рекомендовано Microsoft. API List (Of T) не гарантированно останется неизменным от версии к версии. Таким образом, если вы используете List (Of T) в ваших открытых интерфейсах, ваш код может сломаться при работе на новых версиях CLR.

Кшиштоф Квалина, один из разработчиков BCL, может сказать о Списке :

Почему мы не рекомендуем использовать List в общедоступных API

Мы не рекомендуем использовать List в открытых API по двум причинам.

  • Список не предназначен для расширения. то есть вы не можете переопределить ни одного участника. Это, например, означает, что объект, возвращающий List из свойства, не сможет получать уведомления при изменении коллекции. Коллекция позволяет переопределить защищенный элемент SetItem, чтобы получать «уведомления» при добавлении новых элементов или изменении существующего элемента.
  • Список имеет много членов, которые не имеют отношения во многих сценариях. Мы говорим, что List слишком «занят» для публичных объектных моделей. Представьте себе свойство ListView.Items, возвращающее List со всем его богатством. Теперь рассмотрим фактический тип возвращаемого значения ListView.Items; это намного проще и похоже на Collection или ReadOnlyCollection .

Источник

...