Когда бы вы не использовали общие коллекции? - PullRequest
3 голосов
/ 31 марта 2009

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

Ответы [ 8 ]

14 голосов
/ 31 марта 2009

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

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

5 голосов
/ 31 марта 2009

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

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

3 голосов
/ 08 апреля 2009

Дженерики - почти всегда правильная вещь для использования. Обратите внимание, что такие языки, как Haskell и ML, по существу only допускают эту модель: в этих языках по умолчанию нет "object" или "void *".

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

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

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

2 голосов
/ 31 марта 2009

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

2 голосов
/ 31 марта 2009

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

1 голос
/ 31 марта 2009

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

1 голос
/ 31 марта 2009
0 голосов
/ 19 декабря 2011

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

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