Забирай мой подход к упрощению управления потоками:
(в .NET 9)
Вместо использования классического
Вместе с ним добавлен метод
Этот тип даёт более удобную и безопасную синхронизацию потоков за счёт нового API.
Оператор
В этом случае он использует новый API, а не старый Monitor.
Пример кода выше.
Что думаешь об этом обновлении?🥺
👉 @KodBlog
(в .NET 9)
Вместо использования классического
System.Threading.Monitor
, в .NET 9 появился новый тип — System.Threading.Lock
.Вместе с ним добавлен метод
Lock.EnterScope()
, который создаёт эксклюзивную область и автоматически освобождает блокировку в конце блока кода.Этот тип даёт более удобную и безопасную синхронизацию потоков за счёт нового API.
Оператор
lock
в C# теперь сам распознаёт, если ты передаёшь объект типа Lock
.В этом случае он использует новый API, а не старый Monitor.
Пример кода выше.
Что думаешь об этом обновлении?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤6🤣1
Вопрос по системному дизайну.
Как бы вы реализовали сервис сокращения ссылок?
У такого сервиса две основные функции:
> Генерация уникального кода для заданного URL
> Редирект пользователей с короткой ссылки на исходный URL
Как бы вы это реализовали на .NET?
Полный разбор системы можно посмотреть здесь🍿
👉 @KodBlog
Как бы вы реализовали сервис сокращения ссылок?
У такого сервиса две основные функции:
> Генерация уникального кода для заданного URL
> Редирект пользователей с короткой ссылки на исходный URL
Как бы вы это реализовали на .NET?
Полный разбор системы можно посмотреть здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤4🍓3
Вместо того чтобы:
→ писать огромный метод с 5+ параметрами
→ и продолжать добавлять всё больше новых параметров
Сделай так:
1. Создай новый класс.
2. Его свойства должны соответствовать параметрам метода.
3. Замени параметры метода на один объект нового класса.
4. Обнови все места, где вызывается этот метод.
Этот приём называется Introduce Parameter Object — вынесение параметров в объект.
Он быстро повышает читаемость и поддерживаемость кода.
👉 @KodBlog
→ писать огромный метод с 5+ параметрами
→ и продолжать добавлять всё больше новых параметров
Сделай так:
1. Создай новый класс.
2. Его свойства должны соответствовать параметрам метода.
3. Замени параметры метода на один объект нового класса.
4. Обнови все места, где вызывается этот метод.
Этот приём называется Introduce Parameter Object — вынесение параметров в объект.
Он быстро повышает читаемость и поддерживаемость кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26🤔5🔥2🤨2
Каждый разработчик допускал эту ошибку.
Что не так с этим кодом?
На первый взгляд всё кажется логичным:
🔸 API-эндпоинт регистрации пользователя вызывает
🔸
🔸 EmailService через
Но если присмотреться, метод
В чём проблема с
Вот суть:
❌
Если внутри
Вместо этого приложение может тихо упасть или начать вести себя непредсказуемо.
Почему так происходит?
Методы
Исключения из async void проходят мимо стандартных механизмов обработки.
Правильный подход:
✅ Всегда возвращай Task
Запомни:
Ты сталкивался с проблемами из-за async void? Поделись опытом или советами😳
👉 @KodBlog
Что не так с этим кодом?
На первый взгляд всё кажется логичным:
UserService
UserService
сохраняет пользователя в базу и вызывает EmailService
SmtpClient
отправляет письмоНо если присмотреться, метод
SendWelcomeEmail
объявлен как async void
.В чём проблема с
async void
?Вот суть:
async void
делает невозможным отлов исключений.Если внутри
SendEmailAsync()
произойдёт исключение — catch
его не перехватит.Вместо этого приложение может тихо упасть или начать вести себя непредсказуемо.
Почему так происходит?
Методы
async void
не возвращают Task, поэтому вызывающий код не может их await-ить и обрабатывать ошибки.Исключения из async void проходят мимо стандартных механизмов обработки.
Правильный подход:
Запомни:
async void
допустим только для обработчиков событий, где возвращаемый void обязателен.Ты сталкивался с проблемами из-за async void? Поделись опытом или советами
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤🔥4❤2
Как сделать ужасный API-дизайн:
- Возвращай
А как лучше?
Используй Problem Details для обработки ошибок в API.
Хотя бы договоритесь в команде о едином формате ответов при ошибках.
Я видел API, которые возвращают
Problem Details — это стандарт для описания ошибок в HTTP-ответах.
Обычных HTTP-статусов недостаточно, чтобы передать полезную информацию об ошибке.
Реализовать Problem Details в .NET — на самом деле просто.
Вот гайд: читать
Как ты обрабатываешь ошибки в своём API?
👉 @KodBlog
- Возвращай
200 OK
с телом {"success": false}
А как лучше?
Используй Problem Details для обработки ошибок в API.
Хотя бы договоритесь в команде о едином формате ответов при ошибках.
Я видел API, которые возвращают
200 OK
даже при ошибке в теле (да, это в сторону GraphQL-разработчиков).Problem Details — это стандарт для описания ошибок в HTTP-ответах.
Обычных HTTP-статусов недостаточно, чтобы передать полезную информацию об ошибке.
Реализовать Problem Details в .NET — на самом деле просто.
Вот гайд: читать
Как ты обрабатываешь ошибки в своём API?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🔥1
Несколько недель назад мне нужно было найти самый маленький документ в списке.
Первая реализация — отсортировать документы по размеру, а потом взять первый элемент.
Решение сработало. Но Rider подсказал более элегантный вариант:
использовать
Это метод LINQ, появившийся в .NET 6.
Он упрощает получение минимального элемента из коллекции.
Смотрите пример👍
👉 @KodBlog
Первая реализация — отсортировать документы по размеру, а потом взять первый элемент.
Решение сработало. Но Rider подсказал более элегантный вариант:
использовать
MinBy()
Это метод LINQ, появившийся в .NET 6.
Он упрощает получение минимального элемента из коллекции.
Смотрите пример
Please open Telegram to view this post
VIEW IN TELEGRAM
❤23👍11🔥3🤔1
Слой Domain должен отражать бизнес-логику, а не технические детали.
Несколько лет назад я этого не понимал.
В старых проектах у меня структура Domain выглядела так:
🔸 Entities
🔸 Repositories
🔸 ValueObjects
🔸 Enumerations
🔸 Exceptions
Выглядит аккуратно, но на деле прячет суть предметной области.
Теряется связанность — чтобы понять один use case, приходится скакать по разным папкам.
Сейчас я группирую связанные концепции по фичам, а не по типам.
Что в итоге?
🔸 Лучше связанность
🔸 Проще навигация
🔸 Быстрее онбординг
🔸 Код проще поддерживать
👉 @KodBlog
Несколько лет назад я этого не понимал.
В старых проектах у меня структура Domain выглядела так:
Выглядит аккуратно, но на деле прячет суть предметной области.
Теряется связанность — чтобы понять один use case, приходится скакать по разным папкам.
Сейчас я группирую связанные концепции по фичам, а не по типам.
Что в итоге?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10💯5
Как защитить приложение от уязвимостей:
(всего в 4 строках кода)
Используйте
С минимальными усилиями вы можете защитить Web API, добавив аутентификацию и авторизацию.
После быстрой настройки (всего в несколько строк кода) вы автоматически получаете готовые эндпоинты для:
✅ двухфакторной аутентификации
✅ входа в систему
✅ регистрации
✅ сброса пароля
✅ подтверждения email
Безопасность это не то, что стоит реализовывать с нуля самостоятельно.
Выше пример, как это настроить
👉 @KodBlog
(всего в 4 строках кода)
Используйте
ASP.NET Core 8 Identity
ASP.NET Core 8 Identity
вводит новые API, упрощающие реализацию входа и управление учетными записями.С минимальными усилиями вы можете защитить Web API, добавив аутентификацию и авторизацию.
После быстрой настройки (всего в несколько строк кода) вы автоматически получаете готовые эндпоинты для:
Безопасность это не то, что стоит реализовывать с нуля самостоятельно.
Выше пример, как это настроить
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5
Одна из полезных фич — collection expressions.
С ними:
- можно вставлять существующие коллекции прямо в выражение с помощью
- создавать новые коллекции в более чистом и компактном виде
- легко менять тип целевой коллекции без лишнего кода
Фича небольшая, но сильно улучшает читаемость.
Если не пробовал, стоит глянуть.🎧
Посмотри, как это работает + ещё 8 советов по чистому коду: читать
👉 @KodBlog
С ними:
- можно вставлять существующие коллекции прямо в выражение с помощью
..
- создавать новые коллекции в более чистом и компактном виде
- легко менять тип целевой коллекции без лишнего кода
Фича небольшая, но сильно улучшает читаемость.
Если не пробовал, стоит глянуть.
Посмотри, как это работает + ещё 8 советов по чистому коду: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥1👀1
Если ты всё ещё пишешь фабрики в 2025 — ты оверинжинириш.
В .NET 8 появились Keyed Services более чистый и быстрый способ разрешать зависимости с минимумом шаблонного кода.
✅ Без кастомных фабрик
✅ Без
✅ Нативная поддержка в DI-контейнере
Вместо того чтобы инжектить фабрику и вручную резолвить зависимости,
ты просто запрашиваешь нужный сервис по ключу — всё остальное делает фреймворк.
Без лишнего кода. Без лишней абстракции. Просто чистый DI.
👉 @KodBlog
В .NET 8 появились Keyed Services более чистый и быстрый способ разрешать зависимости с минимумом шаблонного кода.
if-else
или switch
Вместо того чтобы инжектить фабрику и вручную резолвить зависимости,
ты просто запрашиваешь нужный сервис по ключу — всё остальное делает фреймворк.
Без лишнего кода. Без лишней абстракции. Просто чистый DI.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤔13❤2🥴2🤣1
Друзья, хочу порекомендовать вам отличную студию — Martin.s Code 💎
Это команда, которая умеет воплощать идеи в реальные проекты. Они не просто «разработчики» — они делают всё под ключ: от концепта до финального релиза.
✅ Что у ребят за плечами:
● Мультиплеерные игры (кооп, PvP, авторская логика)
● AI-боты в Telegram (сценарии общения, автоматизация)
● AR/VR-проекты (обучение, презентации, интерактив)
● Платёжные системы (подписки, донаты, юнит-экономика)
● 3D-модели, анимации, UI/UX с акцентом на пользу
Они работают гибко, без бюрократии, напрямую с исполнителями — без потерь по смыслу и срокам. А главное — реально шарят в системах любой сложности.
☄️ Плюс у них есть свой телеграм-канал, где делятся опытом: команда, процессы, продакшн, кейсы и факапы — без инфоцыганства, только практика и реальные советы.
Подписывайтесь, если хотите расти и в разработке, и в управлении.
И если интересно, как они работают, — заходите на их официальный сайт
👉 Подписывайтесь — если вам нужен адекватный канал про геймдев, разработку и продакшн
Это команда, которая умеет воплощать идеи в реальные проекты. Они не просто «разработчики» — они делают всё под ключ: от концепта до финального релиза.
● Мультиплеерные игры (кооп, PvP, авторская логика)
● AI-боты в Telegram (сценарии общения, автоматизация)
● AR/VR-проекты (обучение, презентации, интерактив)
● Платёжные системы (подписки, донаты, юнит-экономика)
● 3D-модели, анимации, UI/UX с акцентом на пользу
Они работают гибко, без бюрократии, напрямую с исполнителями — без потерь по смыслу и срокам. А главное — реально шарят в системах любой сложности.
Подписывайтесь, если хотите расти и в разработке, и в управлении.
И если интересно, как они работают, — заходите на их официальный сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Martin.s Code
● Разработка игр и приложений на заказ
● Эксклюзивные кадры с этапов разработки
● Интересные посты и интерактивы
🌐 Официальный сайт: https://martinscode.tech/
Для сотрудничества и заказов: @geggggr
● Эксклюзивные кадры с этапов разработки
● Интересные посты и интерактивы
🌐 Официальный сайт: https://martinscode.tech/
Для сотрудничества и заказов: @geggggr
👍4❤2🌚2🔥1
Dapper быстрый, но отображение отношений "один ко многим" может вызвать проблемы.
В чём проблема?
SQL-join возвращает дублированные данные с "одной" стороны, а Dapper отдаёт по одной строке за раз.
Как решить?
Используйте
Это просто, как только вы освоите шаблон.
Вот чистый пример: ссылка на статью
Вы сталкивались с этой проблемой при использовании Dapper?🥰
👉 @KodBlog
В чём проблема?
SQL-join возвращает дублированные данные с "одной" стороны, а Dapper отдаёт по одной строке за раз.
Как решить?
Используйте
Dictionary<TKey, TEntity>
, чтобы отслеживать и повторно использовать родительские объекты при добавлении дочерних элементов.Это просто, как только вы освоите шаблон.
Вот чистый пример: ссылка на статью
Вы сталкивались с этой проблемой при использовании Dapper?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤3👍2
Как перестать усложнять проверки типов:
(и назначать переменные с ненулевыми значениями)
Используйте шаблон объявления (declaration pattern).
Шаблон объявления позволяет проверить, совместим ли тип выражения во время выполнения с указанным типом.
Также можно объявить локальную переменную как результат этой проверки.
Пример использования шаблона объявления в коде выше.
👉 @KodBlog
(и назначать переменные с ненулевыми значениями)
Используйте шаблон объявления (declaration pattern).
Шаблон объявления позволяет проверить, совместим ли тип выражения во время выполнения с указанным типом.
Также можно объявить локальную переменную как результат этой проверки.
Пример использования шаблона объявления в коде выше.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤7😁3
Forwarded from Data Science. SQL hub
🎁 РАЗЫГРЫВАЕМ MacBook Air!
Разыгрываем шикарный 13-дюймовый MacBook Air! Отличная рабочая машинка!
Условия участия максимально простые:
🔸Подписаться на телеграм-канал: @sqlhub
🔸Подписаться на телеграм-канал: @ai_machinelearning_big_data
🔸Нажать кнопку "Участвовать" ниже.
ВСЁ! Вы участник! Бот выберет одного человека, которому мы подарим этот MacBook. Доставка по зоне СДЭК.
Итоги подведём 14 августа.
Всем удачи! Пусть победит самый приятный человек!
⚠️ Если бот подвис — не беспокойтесь, вас все равно зарегистрирует, просто выполните условия и нажмите «Участвую».
Разыгрываем шикарный 13-дюймовый MacBook Air! Отличная рабочая машинка!
Условия участия максимально простые:
🔸Подписаться на телеграм-канал: @sqlhub
🔸Подписаться на телеграм-канал: @ai_machinelearning_big_data
🔸Нажать кнопку "Участвовать" ниже.
ВСЁ! Вы участник! Бот выберет одного человека, которому мы подарим этот MacBook. Доставка по зоне СДЭК.
Итоги подведём 14 августа.
Всем удачи! Пусть победит самый приятный человек!
⚠️ Если бот подвис — не беспокойтесь, вас все равно зарегистрирует, просто выполните условия и нажмите «Участвую».
👍3❤1🔥1
Хватит загружать строки в память только ради их удаления.
В EF Core теперь есть поддержка массового удаления через
- Пиши LINQ-запрос для фильтрации записей
- Чейни несколько
- Вызывай
Без трекинга, без материализации. Только SQL.
👉 Как это использовать (и на что стоит обратить внимание) — читать
Ты уже используешь массовое удаление (или обновление) в своих проектах?
👉 @KodBlog
В EF Core теперь есть поддержка массового удаления через
ExecuteDelete()
.- Пиши LINQ-запрос для фильтрации записей
- Чейни несколько
Where
-условий - Вызывай
ExecuteDelete()
, чтобы выполнить один SQL DELETE
Без трекинга, без материализации. Только SQL.
Ты уже используешь массовое удаление (или обновление) в своих проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3
45 вопросов для подготовки к собеседованию по C#
Реальные вопросы, не сгенерированные ИИ
1. В чём разница между
2. Для чего используется ключевое слово
3. Перечисли все модификаторы доступа для типов.
4. В чём разница между
5. Когда вызывается статический конструктор?
6. Как создать метод расширения?
7. Поддерживает ли C# множественное наследование классов?
8. Объясни, что такое упаковка (
9. Что такое куча (heap) и стек (stack)?
10. В чём разница между
11. Как создать дату с заданным часовым поясом?
12. Как изменить текущую культуру (
13. В чём разница между
14. Какова цель метода
15. Создаёт ли метод LINQ
16. Объясни отложенное выполнение (deferred execution) в LINQ.
17. Как работает
18. Какие преимущества дают замороженные коллекции (
19. Назови потокобезопасные коллекции.
20. Как реализовать
21. Перечисли все способы создания нового потока.
22. Как выполнить несколько
23. Объясни разницу между наследованием и композицией.
24. В чём отличие
25. Для чего используются
26. Назови две формы
27. Для чего используется ключевое слово
28. Какова цель первичных конструкторов (
29. Объясни, как работают nullable reference types (nullable-ссылочные типы).
30. Есть ли ограничения по возвращаемому типу у
31. Для чего используется
32. Сколько поколений у сборщика мусора (
33. Для чего используется класс
34. Какой код компилятор генерирует для автосвойств (
35. Как реализуется полиморфизм в C#?
36. Как реализуется инкапсуляция в C#?
37. В чём разница между параметрами
38. Как работает оператор
39. Что такое
40. Объясни перегрузку и переопределение методов.
41. В чём разница между
42. Что такое expression trees в LINQ?
43. Как работает обработка исключений в C#?
44. Назови все способы повторной генерации исключения (rethrow).
45. Объясни, что такое обобщения (
👉 @KodBlog
Реальные вопросы, не сгенерированные ИИ
1. В чём разница между
readonly
и const
?2. Для чего используется ключевое слово
sealed
?3. Перечисли все модификаторы доступа для типов.
4. В чём разница между
interface
и abstract class
?5. Когда вызывается статический конструктор?
6. Как создать метод расширения?
7. Поддерживает ли C# множественное наследование классов?
8. Объясни, что такое упаковка (
boxing
) и распаковка (unboxing
).9. Что такое куча (heap) и стек (stack)?
10. В чём разница между
string
и StringBuilder
?11. Как создать дату с заданным часовым поясом?
12. Как изменить текущую культуру (
CultureInfo
)?13. В чём разница между
HashSet
и Dictionary
?14. Какова цель метода
ToLookup
?15. Создаёт ли метод LINQ
Cast<T>
новый объект?16. Объясни отложенное выполнение (deferred execution) в LINQ.
17. Как работает
ImmutableList
?18. Какие преимущества дают замороженные коллекции (
Frozen collections
)?19. Назови потокобезопасные коллекции.
20. Как реализовать
lock
в асинхронном коде?21. Перечисли все способы создания нового потока.
22. Как выполнить несколько
async
-задач одновременно?23. Объясни разницу между наследованием и композицией.
24. В чём отличие
class
, record
и struct
?25. Для чего используются
ref struct
?26. Назови две формы
record
.27. Для чего используется ключевое слово
with
?28. Какова цель первичных конструкторов (
Primary Constructors
)?29. Объясни, как работают nullable reference types (nullable-ссылочные типы).
30. Есть ли ограничения по возвращаемому типу у
switch
-выражений?31. Для чего используется
yield return
?32. Сколько поколений у сборщика мусора (
GC
)?33. Для чего используется класс
Interlocked
?34. Какой код компилятор генерирует для автосвойств (
auto-properties
)?35. Как реализуется полиморфизм в C#?
36. Как реализуется инкапсуляция в C#?
37. В чём разница между параметрами
ref
и out
?38. Как работает оператор
using
?39. Что такое
delegate
и как он используется?40. Объясни перегрузку и переопределение методов.
41. В чём разница между
IEnumerable
и IQueryable
?42. Что такое expression trees в LINQ?
43. Как работает обработка исключений в C#?
44. Назови все способы повторной генерации исключения (rethrow).
45. Объясни, что такое обобщения (
generics
).Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥7👍5🌭1
Эта фича показала мне, насколько PostgreSQL крут.
Думаю, тебе тоже понравится.
В одном проекте мне нужно было за одну операцию вставить 5 тысяч записей.
Хранилищем был Postgres, и, естественно, всё должно было работать быстро.
После небольшого ресёрча я наткнулся на команду
Эта команда позволяет выполнять массовую вставку данных напрямую в базу.
Метод
Так как при этом сохраняются типы данных без конвертации, лучше использовать
Что скажешь?🙂
👉 @KodBlog
Думаю, тебе тоже понравится.
В одном проекте мне нужно было за одну операцию вставить 5 тысяч записей.
Хранилищем был Postgres, и, естественно, всё должно было работать быстро.
После небольшого ресёрча я наткнулся на команду
COPY
.Эта команда позволяет выполнять массовую вставку данных напрямую в базу.
Метод
BINARY COPY
отправляет данные в бинарном формате, который Npgsql
декодирует, и после вызова Complete()
данные сохраняются в БД.Так как при этом сохраняются типы данных без конвертации, лучше использовать
NpgsqlDbType
— он позволяет явно указать нужный тип без неоднозначностей.Что скажешь?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤔3❤2