Лучший ресурс для обучения .NET-дженериков?
В моей работе я никогда не использовал какие-либо обобщенные методы .NET, но я понимаю, что они довольно популярны. У кого-нибудь есть хорошие ссылки или предложения по книге для их изучения? В качестве бонуса; Я только смутно понимаю, какие общие коллекции .NET и что они делают... есть ли у кого-нибудь практические примеры того, как они могут использоваться для большего преимущества, чем обычные коллекции в .NET?
Ответы
Ответ 2
Очевидный выбор.
Ответ 3
CLR через С# Джеффри Рихтера подробно рассказывает о дженериках и является одним из бесценных ресурсов, которыми должен владеть и читать каждый .NET-разработчик.
Ответ 4
Если вы когда-либо использовали шаблоны С++, то .Net generics - это почти одно и то же. Они даже используют синтаксис <T> .
Даже если вы не знаете какой-либо С++, вы, вероятно, делаете это сложнее, чем вам нужно, особенно в отношении коллекций. Они похожи на любую другую коллекцию, но при их создании вы указываете имя типа внутри < < > , поэтому компилятор знает, какой элемент они хранят.
Ответ 5
С# 3.0 в двух словах - фантастический справочник с примерами, достаточно большими, чтобы понять концепцию без ощущения раздувания.
Ответ 6
Я нашел WROX Professional.NET 2.0 Generics очень полезным, поскольку он содержит множество примеров реального мира. Дженерики могут вводить в заблуждение новичка, но они могут быть очень полезным/мощным инструментом для экономии времени в руках опытного разработчика. Лично я нахожу .NET Generics наиболее полезными для упрощения определения и использования коллекций. Кроме того, использование дженериков может привести к более эффективному коду, поскольку это может свести к минимуму падение производительности, обычно связанное с преобразованиями типа бокса/распаковки.
Ответ 7
Лучше всего следить за обучением Microsoft по этому вопросу. Если вы ищете книги, то было бы идеально:
Ответ 8
Мое голосование - в основном вы можете просто избежать их:)
Основным преимуществом для дженериков является сохранение кастинга, если вы закончите делать кастинг внутри, что не имеет никакого смысла. Если вы попытаетесь изучить эту проблему, вы обнаружите, что в основном кандидаты на дженерики - это действительно те коллекции/наборы, которые могут создать собственное хранилище внутри страны для такой выгоды. С другой стороны, большинство других компонентов имеют небольшую/невысокую производительность и значительно уменьшают гибкость по сравнению с реализацией наследования интерфейса.
Если кастинг вас очень раздражает, возможно, вам стоит рассмотреть динамические языки, такие как IronPython:)
И если вы действительно сталкиваетесь с сценарием, который, по вашему мнению, имеет общий смысл, опубликуйте его в качестве другого вопроса, мозг здесь может выглядеть вместе и решать его в каждом случае:)
Обновление: проверка компилятора Yep неплоха, но проверьте источник проекта Castle Project, вы можете увидеть множество ситуаций, когда общий тип встает на путь, потому что вы не можете делать такие вещи, как IBusinessObject, намного более гибкие, чем BusinessObject- потому что вы не можете наложить что-то наследуемое из BusinessObject обратно в BusinessObject и ожидать доступа к функции, унаследованной. Обычно я видел, что код заканчивается как BusinessObjectBase → BusinessObject → ваш фактический класс. Поэтому я считаю, что не всегда полезно использовать дженерики, и я был одним из тех, кто злоупотреблял такой реализацией и в конечном итоге имел массу забавных функций с типичной типизацией, не очень приятный.
Обновление № 2: Бокс /Unboxing просто означает требование о том, чтобы бросить объект, когда вы используете абстрактный тип (например, объект) для хранения значения и используйте сильное напечатанное значение для его повторного хранения (что требует кастинга), не так много разницу я вижу, кроме ситуации сбора, которую я изложил. И код вроде этого по-прежнему бокс:
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