В случае универсальных коллекций по сравнению с боксом и др. С более старыми коллекциями, такими как ArrayList, генерики выигрывают в производительности. Но в подавляющем большинстве случаев это не самое важное преимущество дженериков. Я думаю, что есть две вещи, которые имеют гораздо большую выгоду:
- Тип безопасности.
- Самодокументируемый, более читабельный.
Дженерики способствуют обеспечению безопасности типов, заставляя более однородную коллекцию. Представьте, что вы наткнетесь на веревку, когда ожидаете int. Уч.
Общие коллекции также более самодокументированы. Рассмотрим две коллекции ниже:
ArrayList listOfNames = new ArrayList();
List<NameType> listOfNames = new List<NameType>();
Читая первую строку, вы можете подумать, что listOfNames - это список строк. Неправильно! На самом деле хранятся объекты типа NameType. Во втором примере не только утверждается, что типом должен быть NameType (или его потомок), но и код более читабелен. Я сразу понял, что мне нужно найти TypeName и научиться использовать его, просто взглянув на код.
Я видел много таких вопросов, «лучше ли х работает лучше, чем у» в StackOverflow. Вопрос здесь был очень справедливым, и, как выяснилось, дженерики - это победа в любом случае. Но, в конце концов, главное - предоставить пользователю что-то полезное. Конечно, ваше приложение должно иметь возможность работать, но оно также не должно аварийно завершать работу, и вы должны иметь возможность быстро реагировать на ошибки и запросы функций. Я думаю, вы можете увидеть, как эти два последних пункта связаны с безопасностью типов и читабельностью кода в общих коллекциях. Если бы это был обратный случай, если бы ArrayList превзошел List <>, я бы, вероятно, все равно взял бы реализацию List <>, если разница в производительности не была значительной.
Что касается производительности (в целом), я был бы готов поспорить, что вы найдете большинство своих узких мест производительности в этих областях в течение вашей карьеры:
- Плохое оформление базы данных или запросов к базе данных (включая индексацию и т. Д.),
- Плохое управление памятью (забыл вызвать dispose, глубокие стеки, слишком долго держатся за объекты и т. Д.),
- Неправильное управление потоками (слишком много потоков, не вызывая IO для фонового потока в настольных приложениях и т. Д.),
- Плохая конструкция ввода-вывода.
Ни одно из них не исправлено с помощью однолинейных решений. Мы, программисты, инженеры и фанаты, хотим знать все классные трюки с производительностью. Но важно, что мы не спускаем глаз с мяча. Я верю, что сосредоточение внимания на хороших методах проектирования и программирования в четырех областях, которые я упомянул выше, приведет к гораздо большему, чем беспокойство о небольшом повышении производительности.