C# 1001 notes
Ir al canal en Telegram
Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp
Mostrar más6 613
Suscriptores
+124 horas
+537 días
+4730 días
Archivo de publicaciones
6 609
🚀 5 мощных приёмов рефакторинга в C#, которые сделают ваш код чище, проще и надёжнее
Больше не пишите “спагетти” — превращайте запутанный код в красивую архитектуру.
✅ Уберите дублирование
✅ Разбейте методы
✅ Используйте DI и фабрики
✅ Спрячьте логику в объекты
✅ Упростите условия
👉 Пример до/после — на картинке: из хаоса в чистый, тестируемый, поддерживаемый код.
📌 Подробнее
6 609
Нашёл отличный учебник по основам Computer Science - настоящая находка!
Он охватывает всё самое важное: от классики вроде алгоритма Евклида до продвинутых тем — динамическое программирование, криптография, анализ сложности и не только.
Материал подан чётко, логично и последовательно: каждая концепция — с примерами, интуитивными пояснениями и строгими доказательствами.
Идеально подойдёт тем, кто хочет выйти за рамки синтаксиса и глубоко понять, как устроен код изнутри.
https://eecs376.github.io/notes/algorithms.html
6 609
‼️ Хотите стать разработчиком на C# и создавать игры или бэкенд-приложения? Не знаете, с чего начать?
🎯 Курс «C# Developer» состоит из двух ступеней, с практикой в Scrum-команде и реальными кейсами. Вы освоите не только основы C# и .NET Core, но и научитесь применять LINQ, работать с SQL и использовать Git для управления версиями.
🦾 Это обучение поможет вам перейти с нуля на Middle. Вы изучите продвинутые инструменты бэкенда, повысите качество кода, освоите Scrum и сможете работать в высококачественной команде. А еще вы получите диплом OTUS, который ценят в крупных IT-компаниях.
➡️ Оставьте заявку и получите скидку на обучение, старт уже 29 октября: https://otus.pw/vIeG/?erid=2W5zFJTwJNk
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 609
Что выведет код?
1 — Выбросит исключение
2 — Произойдет взаимоблокировка
3 — Напечатает слово "test"
4 — Напечатает слово "test" бесконечное число раз
6 609
EF Core: Что скрывают за репозиторием?
Entity Framework Core — мощный инструмент, но его часто оборачивают в Repository Pattern, не задумываясь, действительно ли это нужно. На открытом вебинаре курса OTUS C# Developer. Professional Виктор Дзицкий покажет, когда репозиторий оправдан, а когда он только мешает.
📌 5 ноября, 20:00EF
Core: Что скрывают за репозиторием?
— когда Repository Pattern избыточен
— реализация Specification Pattern для гибких запросов
— как объединить оба подхода для чистой архитектуры
Вебинар бесплатный и будет полезен C# и .NET-разработчикам, которые активно используют EF Core и хотят сделать код доступа к данным тестируемым и поддерживаемым.
👉 Регистрируйтесь: https://otus.pw/LsRF/?erid=2W5zFJBmqU4
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 609
🧩 Несколько DbContext в одном приложении на EF Core — когда это нужно
Использовать несколько DbContext в одном приложении — не ошибка, а часто отличное архитектурное решение.
Вот когда это оправдано:
- 🗃 Работа с несколькими базами данных
- 🧠 Разделение областей ответственности
- 🧩 Архитектура modular monolith
- ⚡ Использование read replicas
Автор применил это при создании модульного монолита:
каждый модуль имел собственную схему в БД и отдельный DbContext в коде.
Самое интересное — как EF Core справляется с миграциями и разными схемами баз данных.
Разбор и пошаговое решение — здесь:
🔗 https://milanjovanovic.tech/blog/using-multiple-ef-core-dbcontext-in-single-application
#DotNet #EFCore #CSharp #Backend #Architecture #DesignPatterns
6 609
🖥 Гайд по PostgreSQL для продвинутых разработчиков
PostgreSQL – одна из самых мощных СУБД с открытым исходным кодом. Этот гайд подробно охватывает ключевые аспекты PostgreSQL: от внутренней архитектуры до приёмов оптимизации. Мы рассмотрим администрирование, производительность, расширения, инструменты, а также сравним популярные ORM для Python и Go. В конце приведён список продвинутых вопросов, часто встречающихся на собеседованиях.
🟠Гайд
6 609
С EF Core можно делать действительно классные вещи — вот пример конфигурации сущности:
- 🔒 Check constraint:
Price > 0 — защита данных прямо на уровне БД.
- 🎯 Precision control — задаём точность для столбца Price, чтобы избежать ошибок округления.
- 🧩 Unique index на Name — просто потому что можно (и полезно).
Пример конфигурации:
builder.Property(p => p.Price)
.HasPrecision(10, 2);
builder.HasCheckConstraint("CK_Product_Price_Positive", "Price > 0");
builder.HasIndex(p => p.Name)
.IsUnique();
Следующий шаг — создать EF migration, чтобы применить эти настройки в базе данных.
Если вы хотите разобраться глубже — вот отличный гайд по миграциям в EF Core: гайд6 609
🔥 Открытый урок «C# и ORM: работаем с базой данных».
Взаимодействие с базами данных - классический сценарий работы программы. В рамках ОУ рассмотрим инструменты из категории ORM, которые позволяют используя язык C# работать с БД (на примере PostgreSQL) безопасно и эффективно.
🗓 21 октября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «C# Developer».
🎯 О чём поговорим:
✔️ для чего нужны БД
✔️ Какие сценарии использования реляционных баз данных на примере PostgreSQL
✔️ Что такое ORM
✔️ Какие библиотеки (ORM) используются при разработке на C# для работы с базами данных
✔️CRUD операции (создать, читать, обновить, удалить запись в БД)
👥 Кому будет полезно:
- Тем, кто понимает, как работает C#, но хочет узнать, как применять его в реальных программах
- Тем, кто писал на других языках программирования, и хочет узнать, как работать с БД на платформе .Net
🔗 Ссылка на регистрацию: https://otus.pw/iONDI/?erid=2W5zFHHzeNc
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 609
⚡ .NET Channel Publisher — простой способ строить настоящий async messaging
📌 Как это работает:
- Использует
System.Threading.Channels для асинхронной публикации событий
- Сообщения пишутся в канал и обрабатываются в фоне, не блокируя поток
- Поддержка CancellationToken для безопасной отмены
🔥 Плюсы:
- Минимум кода — максимум гибкости
- Высокая производительность и низкая задержка
- Удобно для event-driven архитектуры и микросервисов
На скриншоте:
- Пример класса ChannelPublisher для отправки нотификаций
- Трейсинг вызова Order.Service: POST orders показывает прозрачную обработку и асинхронность
#dotnet #csharp #async #messaging6 609
Что мне нравится в **.NET Aspire** 👇
👉 С ним невероятно просто запускать полезные сервисы. Всего в несколько строк кода можно поднять:
- базу данных
- Redis
- LLM
- reverse proxy
- message broker
Можно даже масштабировать сервисы, чтобы проверить сценарии с конкурентной нагрузкой.
Если вы ещё не пробовали построить своё первое Aspire-приложение — у меня есть подробный гайд о том, как я мигрировал свой .NET проект в Aspire.
🟠Читать здесь: https://milanjovanovic.tech/blog/dotnet-aspire-a-game-changer-for-cloud-native-development
6 609
🌟 Знаете ли вы, что с помощью информационных атрибутов можно получить информацию о вызывающем методе?
@csharp_ci
6 609
⚡️ .NET-приложения должны быть устойчивыми — и сделать их надежнее реально за пару минут.
В .NET 8 и выше есть библиотеки от Microsoft и обновлённый API Polly — популярной библиотеки для повышения надёжности и обработки сбоев.
С Polly можно легко настроить стратегии:
- повтор запросов (Retry)
- резервные сценарии (Fallback)
- ограничение времени (Timeout)
- контроль частоты (Rate-limiting)
- автоматическое отключение при сбоях (Circuit breaker)
Эти механизмы помогают облачным приложениям оставаться живыми даже в условиях ошибок и перегрузок.
Подробный разбор тут
6 609
🔥 Лучшая фича C# за последние годы? Pattern Matching
Зачем он нужен:
Pattern matching позволяет элегантно проверять объект на определённые свойства:
- ✅ Является
null или не null
- ✅ Является объектом конкретного типа
- ✅ Имеет свойство с определённым значением
В связке со switch-выражениями и record-типами это превращает код в лаконичный и выразительный.
📌 Пример:
static string PrintShape(object shape) =>
shape switch
{
null => "Нет объекта",
Circle c => $"Круг с радиусом {c.Radius}",
Rectangle { Width: > 0, Height: > 0 } r => $"Прямоугольник {r.Width}x{r.Height}",
_ => "Неизвестная фигура"
};6 609
⚡️ dotnet/eShop — справочное .NET-приложение (reference application)
📌 Что это такое
- Приложение-пример на .NET, которое реализует веб-сайт электронной коммерции (eCommerce) с архитектурой, основанной на сервисах.
- Использует .NET 9.
- Код лицензирован по MIT.
📌 Как запустить
- Клонировать репозиторий.
- Установить .NET 9 SDK.
- Для Windows: можно использовать Visual Studio (2022 17.10+).
- Можно запустить через Docker Desktop.
- Через терминал:
```bash
dotnet run --project src/eShop.AppHost/eShop.AppHost.csproj
📌 Особенности
Пример данных каталога хранится в catalog.json, описания продуктов и брендов — вымышленные.
Изображения продуктов сгенерированы с помощью DALL·E 3.
Есть версия приложения, подготовленная для деплоя в Azure.
📌 Почему полезно
- Подходит как учебный материал для изучения структуры реального .NET-приложения.
- Демонстрирует современные практики: архитектура, CI/CD, микросервисы.
- Можно использовать как стартовую точку для собственных проектов.
#dotnet #eCommerce #ReferenceApp #MIT #Architecture #SampleProject #Microservices
Репозиторий: https://github.com/dotnet/eShop
6 609
Готовились к LeetCode, но на интервью дали задачу «не по учебнику»? А может, думали, что знаете async/await, но на senior собеседовании вас спросили про ConfigureAwait и CLR?
Технические интервью в C# — это всегда стресс и неожиданные повороты. Где-то проверяют умение решать нестандартные задачи, где-то — глубину понимания работы платформы. Важно быть готовым к обоим сценариям.
📅 В сентябре пройдут сразу два бесплатных вебинара в рамках курса «C# Developer. Professional», которые помогут вам:
→ понять, что делать, если привычные паттерны не работают и идей нет;
→ прокачать навыки live-coding в реальном времени;
→ разобраться в тонкостях async/await, CLR и управления памятью;
→ научиться уверенно отвечать на вопросы уровня senior и проектировать системный дизайн.
Вы получите практику и стратегию подготовки к интервью — от первых шагов до экспертных уровней. После вебинаров вы сможете превратить страх перед собеседованиями в уверенность и чётко показать свой уровень на интервью.
👉 Бесплатная регистрация по ссылке — успейте занять место: https://otus.pw/E3c8/?erid=2W5zFHKLZG4
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 609
⚡ .NET Aspire позволяет запускать фронтенд прямо из Vite
В Community Toolkit появился пакет `Aspire.Hosting.NodeJS.Extensions`, который позволяет интегрировать Node.js-приложения в .NET Aspire.
🔥 Что он даёт:
- Запуск Vite-приложений напрямую из Aspire.
- Поддержка npm, Yarn и pnpm — выбирай свой пакетный менеджер.
- Автоустановка зависимостей перед стартом (`WithNpmPackageInstallation()`,
WithYarnPackageInstallation(), `WithPnpmPackageInstallation()`).
- Лёгкая интеграция фронтенда и бэкенда: всё управляется из одного места.
📌 Пример кода:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddViteApp("vite-demo")
.WithExternalHttpEndpoints();
builder.AddViteApp("yarn-demo", packageManager: "yarn")
.WithExternalHttpEndpoints();
builder.AddViteApp("pnpm-demo", packageManager: "pnpm")
.WithExternalHttpEndpoints();
builder.Build().Run();
💡 Итог: теперь запуск React/Vue/Angular через Vite можно встроить прямо в Aspire, без лишних шагов и костылей.
📌 Подробнее
#dotnet #Aspire #NodeJS #Vite #Frontend6 609
⚡ C# полезный совет
Хотите ускорить работу со строками, когда нужно часто их конкатенировать?
Не используйте обычный
+ в цикле — это создаёт лишние объекты в памяти.
Вместо этого применяйте `StringBuilder`:
using System.Text;
var sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
sb.Append("строка ").Append(i).AppendLine();
}
string result = sb.ToString();
Console.WriteLine(result);
📌 Что это даёт:
- StringBuilder не создаёт новую строку при каждой операции
- Сильно экономит память и ускоряет код в циклах
- Особенно полезно при работе с большими логами или генерацией отчётов6 609
🔥 Успех в IT = скорость + знания + окружение
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
6 609
🚫 EF Core + «репозитории» = лишний слой
Часто советуют заворачивать EF Core в Repository Pattern.
Но на практике это делает код только сложнее:
-
DbContext уже реализует Repository и Unit of Work
- Репозитории со временем превращаются в «монстров» с десятками методов
- Каждый новый фильтр = новая копипаста
В итоге — абстракция над абстракцией и трудности с поддержкой.
---
✅ Что вместо этого? Specification Pattern
Specification = маленький класс, описывающий правило или фильтр.
Вы комбинируете их и получаете сложные запросы без раздутых репозиториев.
Плюсы:
- 🧩 Простая композиция правил
- 🔍 Ясный и читаемый код
- ♻️ Повторное использование условий
- 🧪 Лёгкое тестирование
📌 Пример
// Бизнес-правило: активные клиенты с заказами за последние 30 дней
public sealed class ActiveCustomersSpec : Specification<Customer>
{
public ActiveCustomersSpec(DateTime since)
{
Criteria = c => c.IsActive && c.Orders.Any(o => o.CreatedAt >= since);
AddInclude(c => c.Orders);
}
}
// Применение
var spec = new ActiveCustomersSpec(DateTime.UtcNow.AddDays(-30));
var customers = await db.Set<Customer>().Apply(spec).ToListAsync();
💡 Итог:
EF Core = уже Repository + UoW
Репозитории поверх EF Core → лишняя абстракция
Specification Pattern → гибкость и читаемость без «метод-монстров»