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





Очевидный выбор ..
CLR через C# от Джеффри Рихтера подробно рассказывает о дженериках, и это один из бесценных ресурсов, который должен иметь и читать каждый .NET-разработчик.
Если вы когда-либо использовали шаблоны C++, то общие шаблоны .Net - это почти то же самое. Они даже используют похожий синтаксис <T>.
Даже если вы не знаете C++, вы, вероятно, усложняете задачу, особенно в отношении коллекций. Они такие же, как и любые другие коллекции, но когда вы их создаете, вы указываете имя типа внутри <<>, чтобы компилятор знал, какие элементы они содержат.
C# 3.0 in a Nutshell - фантастический справочник с примерами, достаточно большими, чтобы понять концепцию, не чувствуя себя раздутой.
Мой голос - в основном их можно просто избегать :)
Основным преимуществом дженериков является сохранение приведения, если вы в конечном итоге выполняете внутреннее приведение, что не имеет никакого смысла. Если вы попытаетесь изучить эту проблему, вы обнаружите, что в основном кандидатами на дженерики являются действительно те коллекции / наборы, которые могут создавать внутреннее хранилище для такой выгоды. Большинство других компонентов, с другой стороны, мало / не получают производительности и значительно ухудшают гибкость по сравнению с реализацией наследования интерфейсов.
Если кастинг вас так сильно раздражает, возможно, вам пора подумать о динамических языках, таких как IronPython :)
И - если вы действительно столкнетесь со сценарием, который, по вашему мнению, имеет смысл, опубликуйте его как еще один вопрос, мозги здесь могут найти вместе и решить его от случая к случаю :)
Обновление: Да, проверка компилятора - это хорошо, но проверьте исходный код Castle Project, вы можете увидеть много ситуаций, когда общий тип мешает, потому что вы не можете выполнять кастинг - создание таких вещей, как IBusinessObject, намного более гибкое, чем BusinessObject, потому что вы можете 'не переводит что-то, унаследованное от BusinessObject, обратно в BusinessObject и ожидает доступа к унаследованной функции. Обычно я видел, как код заканчивался как BusinessObjectBase -> BusinessObject -> Ваш фактический класс. Вот почему я как бы чувствую, что использование дженериков не всегда полезно - и я был одним из тех, кто злоупотреблял такой реализацией и в конечном итоге получил массу забавных функций с общей типизацией, что совсем не приятно.
Обновление # 2: упаковка / распаковка просто означает требование привести объект, когда вы используете абстрактный тип (например, объект) для хранения значения и используете строго типизированное значение, чтобы сохранить его обратно (что требует литья), особой разницы я не могу см. отдельно от ситуации сбора, которую я сказал. И такой код по-прежнему боксирует:
public T GetValue<T>() {
return (T) ...;
}
Это обычное злоупотребление, которое я видел чаще всего. Люди думают, что имеют дело с родным шрифтом, но на самом деле это не так. Вместо этого они просто преобразуют приведение в общий синтаксис. Что действительно имеет смысл, так это:
public class MyList<T>
{
private List<T> _list;
...
public T GetValue(int index)
{
return _list[index];
}
Затем снова в хранилище нашей коллекции. Вот почему я сказал, что после хранения коллекции я не вижу много случайных универсальных подсказок. Ссылается на это руководство: http://en.csharp-online.net/Understanding_Generics—Revisiting_Boxing_and_Unboxing
Я нашел WROX Professional .NET 2.0 Generics очень полезным, поскольку он содержит множество реальных примеров. Дженерики могут сбивать с толку новичка, но они могут быть очень полезным / мощным / экономящим время инструментом в руках опытного разработчика. Лично я считаю, что .NET Generics наиболее полезен для упрощения определения и использования коллекций. Кроме того, использование универсальных шаблонов может привести к более эффективному коду, поскольку это может минимизировать снижение производительности, обычно связанное с преобразованием типов упаковки / распаковки.
Лучше всего пройти обучение Microsoft по этой теме. Если вы ищете книги, вам подойдет следующее:
Вы можете делать гораздо больше, чем просто коллекции. И вы, должно быть, не слышали о боксе. От отказа от кастинга можно получить больше, чем просто производительность. Безопасность типов в компиляторе действительно хороша.