Дженерики C#: Список <Объектный> или новый класс расширяет Список <Объект>

Несколько вещей.

  1. Люди размышление о Linq как Linq к SQL.
  2. Некоторые люди думают, что они могут начать заменять весь foreach/logic запросами Linq, не считая эту производительность последствиями.
6
задан Shyju 27 October 2009 в 12:58
поделиться

7 ответов

Наличие дополнительного типа ( ProductList ) требует небольших накладных расходов, но ничего особенного. Но это на самом деле зависит от того, что вы хотите сделать. Во многих отношениях ProductList по-прежнему является плохой идеей, поскольку он сжигает List в общедоступном API, а List не очень расширяемый (например, ни один из методов не является виртуальным ). Коллекция может иметь больше возможностей расширения.

Я бы поспорил в пользу абстракции или инкапсуляции:

public static IList<Product> GetProductList() {...} // abstraction; can return
                                                    // List<Product> if we want

или:

public class ProductList : IList<Product> {...} // encapsulation, but need to
                                                // add a lot of dull code

Жаль, что C # не выполняет инкапсуляцию подход простой (я думаю "миксины").

Обратите внимание, что еще один прием (иногда подходящий,

10
ответ дан 8 December 2019 в 04:09
поделиться

Целью дженериков, среди прочего, было продвижение повторного использования кода. Ваш первый подход более чем уместен.

Я когда-либо использовал второй подход только тогда, когда мне приходилось добавлять реализации интерфейса в коллекцию (например, IDisposable), добавлять дополнительные функции или сериализовать коллекцию в xaml.

7
ответ дан 8 December 2019 в 04:09
поделиться

Если вы планируете добавить в список функциональные возможности, такие как более удобные методы поиска или запросы для конкретных продуктов, то верните собственный класс ProductList .

Если нет , нет необходимости заключать его в собственный класс. Вместо этого вы должны вернуть IList или IEnumerable , чем более общий, тем лучше. Это сохраняет идею возврата списка или коллекции продуктов, но не связывает вас с фактической реализацией коллекции (связанный список, массив и т. Д.).

5
ответ дан 8 December 2019 в 04:09
поделиться

Microsoft Code Analysis рекомендует унаследовать от Collection , а не List .

Это сообщение в блоге объясняет, почему.

Вы можете унаследовать свой собственный класс коллекции от Collection по следующим причинам:

  • Для добавления дополнительных настраиваемых функций

  • Чтобы предоставить COMVisible строго типизированный класс коллекции.

2
ответ дан 8 December 2019 в 04:09
поделиться

Если вы просто хотите вернуть последовательность продуктов и никогда не будете использовать какие-либо функции из списка, я бы посоветовал вам использовать что-то вроде:

public static IEnumerable<Product> GetProductList()
2
ответ дан 8 December 2019 в 04:09
поделиться

Объем выделяемой памяти должен быть идентичным, но второй вариант более гибкий, так как он позволяет добавлять пользовательские методы в возвращаемый список продуктов.

В интересах инкапсуляции (или абстракция, спасибо Marc), лучше всего вернуть IList или реализовать IList соответственно.

0
ответ дан 8 December 2019 в 04:09
поделиться

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

public static IList GetProductList () {....}

0
ответ дан 8 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: