Если ты уже знал все 25 приёмов — отпишись от меня.
Почти никто не доходит до 11-го приёма по .NET.
(№23 удивил даже меня):
1. Используй async до самого низа стека вызовов. Один блокирующий .Result может привести к взаимной блокировке всей цепочки.
2. ConfigureAwait(false) нужен в библиотеках. Не в коде приложения.
3. Возвращай Task напрямую, если не используешь await. Так не создаётся лишняя state machine.
4. ValueTask подходит для горячих путей, которые обычно завершаются синхронно. Не стоит использовать его повсеместно.
5. IEnumerable — ленивый. Переберёшь его дважды — запрос выполнится дважды.
6. Здесь большинство перестаёт читать. IQueryable выполняется на стороне базы данных. IEnumerable сначала загружает всё в память.
7. Слишком ранний вызов .ToList() ломает оптимизацию фильтрации. Вызывай Where до материализации.
8. Проблема N+1 возникает незаметно. Включи логирование запросов EF Core — и увидишь её в работе.
9. Для операций чтения используй AsNoTracking(). Отслеживание изменений не бесплатно.
10. Проецируй данные в DTO через Select. Не загружай всю сущность целиком.
11. Scoped-сервис внутри Singleton — это ошибка с захваченной зависимостью, которая рано или поздно проявится.
12. Не создавай новый HttpClient для каждого запроса. Используй IHttpClientFactory.
13. Span<T> и stackalloc позволяют работать с данными без выделения памяти в куче. Нулевая нагрузка на GC.
14. В циклах используй StringBuilder вместо +=. Каждая конкатенация создаёт новую строку.
15. Предпочитай string.Create и буферы из пула, чтобы избежать скрытых выделений памяти.
16. Records подходят для неизменяемых данных. Оператор with позволяет бесплатно создавать копии с изменениями.
17. Pattern matching лучше длинных цепочек if/else. Switch-выражения читаются проще.
18. Включай nullable reference types с первого дня. Эти предупреждения — ошибки, до которых ты ещё не добрался.
19. Вместо внедрения IConfiguration используй паттерн Options. Он даёт строгую типизацию и валидацию.
20. Передавай CancellationToken во все асинхронные методы. Прокидывай его дальше по цепочке, а не игнорируй.
21. Используй BackgroundService, а не случайный Task.Run(). Пусть жизненным циклом управляет хост.
22. Сначала измеряй, потом оптимизируй. Используй BenchmarkDotNet, а не интуицию.
23. Именно это удивило меня: по умолчанию делай свои классы sealed. Это даёт JIT бесплатную возможность для оптимизации.
24. Используй Native AOT для быстрого запуска и минимального размера приложения. Убирай всё лишнее при тримминге.
25. Последнее правило — и единственное, которое действительно имеет значение: читай SQL, который генерирует EF Core. Абстракция может вводить в заблуждение, пока не посмотришь, что она создаёт.
@KodBlog
Обсуждение 3
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram