Преимущество использования дженериков заключается в том, что это повышает безопасность типов — вы можете вставить только правильный тип, и вы получите правильный тип, не требуя приведения. Единственная причина, по которой я не могу использовать общие коллекции, заключается в том, что вам нужно хранить некоторые произвольные данные. Я что-то пропустил? Какие еще причины не использовать дженерики при работе с коллекциями?
Когда бы вы не использовали общие коллекции?
Ответы (8)
Если вам нужно хранить произвольные данные, используйте List<object> (или любой другой). Тогда совершенно ясно, что это намеренно произвольно.
Кроме этого, я бы ни для чего не использовал неуниверсальные коллекции. Я использовал IEnumerable и IList, когда преобразовывал ссылку object и не знал, к какому типу ее привести во время компиляции, поэтому неуниверсальные интерфейсы иногда полезны... но не сами неуниверсальные классы.
Другой очевидной причиной является работа с кодом (возможно, устаревшим), который не использует универсальные коллекции.
Вы можете увидеть, как это происходит в самой .NET. System.Windows.Form.Control.Controls не является общим, как и System.Web.UI.Control.Controls.
Дженерики — почти всегда правильный выбор. Обратите внимание, что такие языки, как Haskell и ML, по сути, только допускают эту модель: в этих языках вообще нет «объекта» или «пустоты*» по умолчанию.
Единственные причины, по которым я не могу использовать дженерики:
Когда соответствующий тип просто неизвестен во время компиляции. Такие вещи, как десериализация объектов или создание экземпляров объектов посредством отражения.
Когда пользователи, которые будут использовать мой код, еще не знакомы с ним. Не всем инженерам удобно их использовать, особенно в некоторых более сложных шаблонах, таких как CRTP.
Основным преимуществом является отсутствие штрафов за упаковку или распаковку с универсальными коллекциями типов значений. В этом можно убедиться, если изучить ил с помощью ildasm.exe. Универсальные контейнеры обеспечивают лучшую производительность для типов значений и меньшее улучшение производительности для ссылочных типов.
вариантность типов с дженериками может вас сбить с толку , но чаще всего вам следует использовать универсальные коллекции. На самом деле нет веской причины избегать их, и все причины в мире избегать нетипизированных коллекций, таких как ArrayList.
Одна вещь, которую, я думаю, вам нужно учитывать, это то, что универсальная коллекция не всегда является заменой неуниверсальной коллекции. Например, Dictionary‹object,object› нельзя не просто подключить к экземпляру Hashtable. Они ведут себя по-разному в ряде сценариев, которые могут и будут нарушать работу программ. Переключение между этими двумя коллекциями заставляет хорошего программиста исследовать варианты использования, чтобы убедиться, что различия их не кусают.
Неуниверсальное Collection в пространстве имен Microsoft.VisualBasic имеет некоторые раздражающие причуды и бестолковость, и во многом довольно ужасно, но у него также есть уникальная особенность: это единственная коллекция, которая демонстрирует разумную семантику, если она изменяется во время перечисления; код, который делает что-то вроде удаления всех элементов коллекции, которые соответствуют определенному предикату, может потребовать значительного переписывания, если используется какой-либо другой тип коллекции.