Когда бы вы не использовали общие коллекции?

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


person 1800 INFORMATION    schedule 31.03.2009    source источник
comment
Я переключил «контейнер» на «коллекцию», поскольку именно так они называются в С#.   -  person George Stocker    schedule 31.03.2009
comment
Здесь много хороших ответов, всем спасибо   -  person 1800 INFORMATION    schedule 31.03.2009


Ответы (8)


Если вам нужно хранить произвольные данные, используйте List<object> (или любой другой). Тогда совершенно ясно, что это намеренно произвольно.

Кроме этого, я бы ни для чего не использовал неуниверсальные коллекции. Я использовал IEnumerable и IList, когда преобразовывал ссылку object и не знал, к какому типу ее привести во время компиляции, поэтому неуниверсальные интерфейсы иногда полезны... но не сами неуниверсальные классы.

person Jon Skeet    schedule 31.03.2009

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

Вы можете увидеть, как это происходит в самой .NET. System.Windows.Form.Control.Controls не является общим, как и System.Web.UI.Control.Controls.

person Richard    schedule 31.03.2009

Дженерики — почти всегда правильный выбор. Обратите внимание, что такие языки, как Haskell и ML, по сути, только допускают эту модель: в этих языках вообще нет «объекта» или «пустоты*» по умолчанию.

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

  1. Когда соответствующий тип просто неизвестен во время компиляции. Такие вещи, как десериализация объектов или создание экземпляров объектов посредством отражения.

  2. Когда пользователи, которые будут использовать мой код, еще не знакомы с ним. Не всем инженерам удобно их использовать, особенно в некоторых более сложных шаблонах, таких как CRTP.

person munificent    schedule 07.04.2009

Основным преимуществом является отсутствие штрафов за упаковку или распаковку с универсальными коллекциями типов значений. В этом можно убедиться, если изучить ил с помощью ildasm.exe. Универсальные контейнеры обеспечивают лучшую производительность для типов значений и меньшее улучшение производительности для ссылочных типов.

person Justin Bannister    schedule 31.03.2009

вариантность типов с дженериками может вас сбить с толку , но чаще всего вам следует использовать универсальные коллекции. На самом деле нет веской причины избегать их, и все причины в мире избегать нетипизированных коллекций, таких как ArrayList.

person Joel Coehoorn    schedule 31.03.2009

Вот один из ответов: Изменение с Hashtable на Dictionary .

person Igor Brejc    schedule 31.03.2009

Одна вещь, которую, я думаю, вам нужно учитывать, это то, что универсальная коллекция не всегда является заменой неуниверсальной коллекции. Например, Dictionary‹object,object› нельзя не просто подключить к экземпляру Hashtable. Они ведут себя по-разному в ряде сценариев, которые могут и будут нарушать работу программ. Переключение между этими двумя коллекциями заставляет хорошего программиста исследовать варианты использования, чтобы убедиться, что различия их не кусают.

person JaredPar    schedule 31.03.2009
comment
Можете ли вы привести пример? Я не могу придумать ни одной причины, по которой хэш-таблица и словарь‹объект, объект› не являются взаимозаменяемыми. (минус несколько изменений синтаксиса, очевидно) - person Jason Coyne; 01.04.2009
comment
На самом деле классический пример — это поведение, когда элемент не найден. HashTable возвращает null, а словарь выдает исключение - person 1800 INFORMATION; 01.04.2009
comment
хм. Это, безусловно, правда, но id по-прежнему рассматривает это как проблему синтаксиса. простой метод расширения для возврата null, если ключ не содержится, вернет вас к хеш-функциям - person Jason Coyne; 01.04.2009

Неуниверсальное Collection в пространстве имен Microsoft.VisualBasic имеет некоторые раздражающие причуды и бестолковость, и во многом довольно ужасно, но у него также есть уникальная особенность: это единственная коллекция, которая демонстрирует разумную семантику, если она изменяется во время перечисления; код, который делает что-то вроде удаления всех элементов коллекции, которые соответствуют определенному предикату, может потребовать значительного переписывания, если используется какой-либо другой тип коллекции.

person supercat    schedule 19.12.2011