Лучший ресурс для изучения обобщений .NET?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
6 406
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Очевидный выбор ..

Обобщения MSDN C#

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

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

Joel Coehoorn 17.09.2008 21:12
Ответ принят как подходящий

Я нашел WROX Professional .NET 2.0 Generics очень полезным, поскольку он содержит множество реальных примеров. Дженерики могут сбивать с толку новичка, но они могут быть очень полезным / мощным / экономящим время инструментом в руках опытного разработчика. Лично я считаю, что .NET Generics наиболее полезен для упрощения определения и использования коллекций. Кроме того, использование универсальных шаблонов может привести к более эффективному коду, поскольку это может минимизировать снижение производительности, обычно связанное с преобразованием типов упаковки / распаковки.

Лучше всего пройти обучение Microsoft по этой теме. Если вы ищете книги, вам подойдет следующее:

http://www.microsoft.com/MSPress/books/9469.aspx

Другие вопросы по теме