uk
Feedback
C# 1001 notes

C# 1001 notes

Відкрити в Telegram

Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp

Показати більше
6 539
Підписники
-324 години
-17 днів
-230 день
Архів дописів
🖥 Задача «Перехват исключений и потеря контекста» (C# 12) Дан код:

using System;
using System.Runtime.ExceptionServices;

class Program
{
    static void Main()
    {
        try
        {
            Console.WriteLine(Foo());
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Catch: {ex.Message}");
        }
    }

    static int Foo()
    {
        try
        {
            return Bar();
        }
        finally
        {
            throw new Exception("finally in Foo");
        }
    }

    static int Bar()
    {
        try
        {
            throw new Exception("error in Bar");
        }
        finally
        {
            Console.WriteLine("Bar finally executed");
        }
    }
}
Вопросы: • Что напечатает программа и почему? • В каком порядке выполняются блоки try / finally? • Какая из двух ошибок дойдёт до catch, а какая потеряется? • Как изменить код, чтобы не терять информацию о первой ошибке? Разбор: • Bar бросает Exception("error in Bar"). Прежде чем исключение покинет метод, выполняется его finally, выводя Bar finally executed. • Управление переходит в Foo. Там срабатывает finally, который бросает новое исключение ("finally in Foo"). • По правилам CLR новое исключение из finally заменяет текущее. Первая ошибка пропадает. • В Main перехватывается только «finally in Foo». Консольный вывод: Bar finally executed Catch: finally in Foo Как сохранить обе ошибки Обернуть второе исключение так, чтобы первая причина не потерялась, например:

finally
{
    var pending = new Exception("finally in Foo");
    throw new AggregateException("Foo failed", pending);
}
или переслать исходное исключение через ExceptionDispatchInfo: Exception pending = null; static int Foo() { try { return Bar(); } catch (Exception ex) { pending = ex; // сохраняем первую причину throw; } finally { if (pending != null) ExceptionDispatchInfo.Capture(pending).Throw(); } }``` Так ни одна ошибка не будет потеряна, а отладка станет нагляднее.

Реферальная программа для тех, кто не работает в Ozon: порекомендуйте C#-разработчика уровня senior и заработайте 150 000 ₽.
Реферальная программа для тех, кто не работает в Ozon: порекомендуйте C#-разработчика уровня senior и заработайте 150 000 ₽. Посмотреть вакансии, которые включает программа: https://s.ozon.ru/rja14Mz

In-memory кэш в .NET: плюсы и минусы ✅ Плюсы: • Очень быстрый • Легко реализуется • Не требует внешних зависимостей ⚠️ Минусы
In-memory кэш в .NET: плюсы и минусыПлюсы: • Очень быстрый • Легко реализуется • Не требует внешних зависимостей ⚠️ Минусы: • Данные теряются при перезапуске • Работает только в пределах одного инстанса • Нет шаринга между приложениями 📌 Нужно больше — переходите на распределённый кэш. Redis — топовый выбор, и в .NET есть два стабильных клиента: • StackExchange.RedisMicrosoft.Extensions.Caching.StackExchangeRedis 📘 Хотите понять, когда и как использовать оба подхода? Вот полный гайд: [milanjovanovic.tech/blog/caching-in-aspnetcore-improving-application-performance](https://milanjovanovic.tech/blog/caching-in-aspnetcore-improving-application-performance?utm_source=X&utm_medium=social&utm_campaign=23.06.2025)

💣 Как настроить отказоустойчивое хранилище данных? Дарим гайд за прохождение теста по HighLoad! 🏆 Пройди тест из 29 вопросо
💣 Как настроить отказоустойчивое хранилище данных? Дарим гайд за прохождение теста по HighLoad! 🏆 Пройди тест из 29 вопросов, проверь свой уровень знаний и получи файл “Как настроить отказоустойчивое хранилище данных“! Тест проводится в рамках курса Highload Architect 👉 Пройти тест и забрать файл: https://otus.pw/348d/?erid=2W5zFJdK4JC Если успешно пройдешь тест, то так же сможешь забронировать место в группе по выгодной цене! 🎫 Курс можно приобрести в рассрочку Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

[Best Practice] Явная конфигурация приложений ASP.NET Core В большинстве существующих .NET-проектов конфигурация оказывается
[Best Practice] Явная конфигурация приложений ASP.NET Core В большинстве существующих .NET-проектов конфигурация оказывается неочевидной, хотя в экосистеме .NET уже есть всё необходимое для ясной и понятной настройки ASP.NET Core веб-приложений с DI. Как устроена конфигурация ASP.NET Core - Источники (в порядке приоритета): 1. Host configuration 2. appsettings.json 3. appsettings.{Environment}.json 4. User secrets (в среде Development) 5. переменные окружения 6. аргументы командной строки При дублировании ключей побеждает источник, указанный позже :contentReference[oaicite:0]{index=0}. Выбор способа доступа к настройкам - Через IConfiguration - Через IOptions<T> / IOptionsMonitor<T> Предпочтение паттерну Options даёт типобезопасный доступ к группам настроек и делает их использование очевидным :contentReference[oaicite:1]{index=1}. Где хранить разные параметры - `appsettings.json` — общие настройки (без секретов). - `appsettings.{Environment}.json` — переопределения для конкретного окружения. - User Secrets (`secrets.json`) — локальные секреты (пароли, ключи API); не используйте appsettings.json или appsettings.Development.json для них :contentReference[oaicite:2]{index=2}. - Azure Key Vault — производственные секреты через builder.Configuration.AddAzureKeyVault(...) :contentReference[oaicite:3]{index=3}. - Переменные окружения и CLI — для срочных или разовых переопределений. Рекомендации по внедрению - Избегайте дублирования ключей — задавайте значение только там, где оно действительно меняется. - В README укажите, что разработчикам нужно получить secrets.json из менеджера паролей и настроить User Secrets. - В IaC-скриптах чётко обозначьте необходимые секреты и параметры для каждого окружения. Преимущества подхода - Новым участникам проекта легко разобраться в конфигурации — каждый ключ встречается в одном месте. - Возрастает поддерживаемость и прозрачность настроек. - Упрощается автоматизация развёртывания (IaC): сразу видно, какие секреты и параметры требуются. Читать

👶 Junior developer пишет: notInactive, tempBool 🧑 Middle developer пишет: hadSubscriptionOnceUponATime 🧓 Senior developer
👶 Junior developer пишет: notInactive, tempBool 🧑 Middle developer пишет: hadSubscriptionOnceUponATime 🧓 Senior developer пишет: hasSubscription, isActive 🤔 Почему так происходит? 👉 Потому что булевы переменные — просты по сути, но часто используются неинтуитивно, что делает код запутанным и плохо поддерживаемым. Вот 7 простых правил, как работать с булевыми значениями в C# и резко улучшить читаемость вашего кода: 1. 🚫 Избегайте двойных отрицаний ❌ user.IsNotActiveuser.IsActiveuser.HasNoDeptuser.HasDeptcreditCard.IsNotExpiredcreditCard.IsExpired Двойные отрицания сбивают с толку и делают логику трудной для чтения. 2. ✅ Используйте понятные префиксы ✅ Is: user.IsActiveHas: user.HasDeptShould: order.ShouldBeCanceled Префиксы мгновенно раскрывают назначение переменной. 3. 🔤 Предпочитайте единственное число ❌ areUsershasUsers Единственное число делает значение ясным и конкретным. 4. 🎯 Используйте прилагательные для описания состояния ❌ CancelOrderIsOrderCanceled Булевы переменные должны описывать состояние, а не действие. 5. ⏱ Используйте настоящее время ❌ card.WasExpiredcard.IsExpired Текущие состояния — проще и универсальнее в коде. 6. 🔁 Принцип раннего возврата (Return Early) Пишите условия и булевы проверки так, чтобы код читался сверху вниз, как история — коротко, логично, понятно. 7. ⚠️ Не передавайте булевы параметры ❌ SendEmail(true)SendEmail(SendMode.Immediate) Используйте перечисления или именованные константы — они понятны без документации. 📌 Вывод: Хорошие имена булевых переменных — это не косметика, а основа читаемости и архитектурной чистоты. Хорошо названный isActive понятнее, чем любые комментарии и тесты. 💬 А ты какие правила используешь для наименования булевых переменных? Делись в комментариях 👇

Repost from C++ Academy
🚀 Разработчик показал движок на C, который работает в 14 раз быстрее Unity в браузере — и теперь доступна онлайн-демо. Многие не поверили в заявленную разницу в производительности, поэтому он выложил демо в открытый доступ. Сравнение проводится с реальным Unity-проектом, выложенным на GitHub. 🛠️ C-движок демонстрирует: • Существенно более высокую FPS в браузере • Минимальную просадку при рендеринге • Низкий overhead по сравнению с WebAssembly-сборкой Unity 💬 Автор пока не решил, выкладывать ли исходники C-версии — рассматривает вариант лицензии CC (non-commercial). 🔗 Демо: https://cgamedev.com/ 🔗 Код: https://github.com/gabrieldechichi/unity_webglperftest @cpluspluc

💣 Большая сила - большая ответственность. А ты справишься с тестом по HighLoad? 🏆 Пройди тест из 29 вопросов, проверь свой
💣 Большая сила - большая ответственность. А ты справишься с тестом по HighLoad? 🏆 Пройди тест из 29 вопросов, проверь свой уровень знаний и получи скидку на онлайн-курс «Highload Architect» от OTUS! Если успешно пройдешь тест, сможешь забронировать место в группе по выгодной цене! 🎫 Курс можно приобрести в рассрочку 👉 Пройти тест и забрать скидку: https://otus.pw/pdy8/?erid=2W5zFGJXEcY Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🗂️ Entity Framework Core — ORM нового поколения для работы с БД. Этот инструмент от Microsoft кардинально меняет подход к вз
🗂️ Entity Framework Core — ORM нового поколения для работы с БД. Этот инструмент от Microsoft кардинально меняет подход к взаимодействию с реляционными и NoSQL базами данных. Для работы инструмент предоставляет мощный слой абстракции, позволяя работать с данными как с объектами, автоматизируя CRUD-операции и миграции схемы. EF Core поддерживает широкий пласт СУБД: от классических SQL Server и PostgreSQL до документоориентированной Cosmos DB. Для SQLite-разработчиков есть отдельный оптимизированный провайдер Microsoft.Data.Sqlite. 🤖 GitHub

🤖 Два подхода DDD: Rich Model vs Anemic Model Приглашаем на открытый урок. 🗓 24 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамка
🤖 Два подхода DDD: Rich Model vs Anemic Model  Приглашаем на открытый урок. 🗓 24 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «C# Developer Professional». На вебинаре: ✔️  Разбор концепций: чем анемичная модель (Anemic Model) отличается от богатой (Rich Model) ✔️  Рассмотрим, когда что выбрать ✔️  Оценим преимущества и недостатки каждой из моделей Кому будет полезно: - Всем, кто стремится глубже понять DDD - .NET-разработчикам, проектирующим сложные системы с долгосрочной поддержкой - Студентам, изучающим паттерны проектирования и чистую архитектуру Чему научатся участники по итогам вебинара: - Понимать, когда код попадает в антипаттерн Anemic Model - Проектировать сущности с бизнес-логикой внутри - Выбирать компромиссы: скорость разработки (Anemic) vs гибкость/безопасность (Rich). 🔗 Ссылка на регистрацию: https://otus.pw/lgGf/ #реклама О рекламодателе

⚡️ Если ты запускаешь десяток терминалов для старта приложения С .NET Aspire можно запускать backend, frontend и все зависимо
+1
⚡️ Если ты запускаешь десяток терминалов для старта приложения С .NET Aspire можно запускать backend, frontend и все зависимости одновременно — быстро и удобно! Смотри, как это сделать: justkeepcoding.tech/blog/integrating-angular-into-dotnet-aspire

Балансировка и геораспределение: как создать быстрое и надёжное приложение для всего мира На вебинаре разберём, как крупные к
Балансировка и геораспределение: как создать быстрое и надёжное приложение для всего мира На вебинаре разберём, как крупные компании — такие как Netflix, Amazon и другие — делают свои сервисы доступными для пользователей по всему миру без задержек и сбоев. На вебинаре вы: — Как работают балансировщики и «умные» прокси. — Что такое геораспределение и зачем оно критично для масштабируемых сервисов. — Как грамотно распределять трафик между дата-центрами. — Частые ошибки при проектировании глобальных систем — и как их избежать. 👉 Регистрация и подробности о курсе Highload Architect: https://tglink.io/e860f3379195?erid=2W5zFGLzfAg Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов. Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🌺 Radzen Blazor Components — 90+ UI-компонентов для Blazor. Этот набор открытых компонентов позволяет быстро собирать интерф
🌺 Radzen Blazor Components — 90+ UI-компонентов для Blazor. Этот набор открытых компонентов позволяет быстро собирать интерфейсы на Blazor без зависимостей от JavaScript-фреймворков. Все элементы нативные для Blazor, написанные на C#, что обеспечивает полную интеграцию с экосистемой .NET. Проект активно развивается: новые компоненты появляются регулярно, а не ждут квартальных релизов. Для коммерческой разработки доступна платная подписка с расширенной поддержкой, но базовая функциональность остаётся бесплатной под лицензией MIT. 🤖 GitHub @csharp_ci

Не знаешь, что ещё могут спросить на собеседовании по C#? Наш бот подскажет ⚡️ Просто напиши тему — например, C# — и @tiny_in
Не знаешь, что ещё могут спросить на собеседовании по C#? Наш бот подскажет ⚡️ Просто напиши тему — например, C# — и @tiny_interview_bot засыплет тебя вопросами. Ответы — "под катом", чтобы не подглядывать. ⚠️ Нужно точечно?Пиши узкую тему — хоть async/await, хоть dependency injection в ASP.NET, хоть LINQ internals — и бот будет гонять тебя только по ней. 📈 Повторяй десятки вопросов каждый день, по любой теме — от основ до продвинутых концепций. 🎯 Идеально для: Быстрой самопроверки Подготовки к техническим интервью Закрытия пробелов в знаниях 👉 Попробуй сам — @tiny_interview_bot И на собесе тебя уже ничем не удивят 😎 erid: 2W5zFHkYKDz

🚀 Вышел .NET 10 Preview 5 — с улучшениями на всех фронтах! 🛠️ В этом обновлении Microsoft прокачала: • Runtime — улучшена п
🚀 Вышел .NET 10 Preview 5 — с улучшениями на всех фронтах! 🛠️ В этом обновлении Microsoft прокачала: • Runtime — улучшена производительность и управление памятью • C# — новые языковые фичи для более выразительного кода • ASP.NET Core — оптимизация рендеринга и поддержки HTTP • Blazor — упрощена работа с интерактивными компонентами • MAUI — ускорены сборки и улучшена поддержка платформ • + расширены инструменты диагностики и безопасности ✅ Почему стоит обратить внимание Серьёзные улучшения в производительности и безопасность Новые фичи как в Runtime, так и в C#, веб-фреймворках и UI (MAUI) Продолжение активного развития с учётом обратной связи сообщества 📌 Подробности 📌 Скачать .NET 10 уже сейчас выглядит как одно из самых амбициозных обновлений в экосистеме. @csharp_ci

🧠 Задача для .NET разработчиков: «Загадочная утечка памяти в ASP.NET Core приложении» 🧩 Уровень: Senior .NET / Backend Engineer 🎯 Цель: Найти и устранить причину роста памяти без падений и исключений 📍 Ситуация: У вас — высоконагруженное API на ASP.NET Core (.NET 8), работающее под Linux в контейнере. Сервис обрабатывает тысячи запросов в минуту. Мониторинг показывает: - Память растёт стабильно, но не освобождается - GC работает, но не очищает выделенную память - dotnet-counters показывает рост в LOH (Large Object Heap) - Приложение не падает, но хост начинает свапать и тормозить - При перезапуске — память очищается, но через 2–3 часа снова заполняется ❗ В логах — тишина, ошибок нет. Библиотеки: Newtonsoft.Json, HttpClient, MemoryCache, EF Core. --- 🧩 Твоя задача: 1. Почему .NET GC может не освобождать LOH, даже при работе GC? 2. Какие действия вызывают накопление в LOH? 3. Как можно отследить, какие объекты скапливаются в памяти? 4. Чем опасен повторный вызов HttpClient или StringBuilder без очистки? 5. Как корректно использовать MemoryCache, чтобы избежать утечек? 💡 Подсказка: - LOH начинается с объектов > 85,000 байт - Часто виноваты: большие строки, сериализация, `ToString()`,🧠 Задача для .N🧠 Задача🧠 Задача -Задача для .NETможет хранить сильные ссылки бесконечно, если не задано время жизни - Частое создание 🧩 Уровень: S— может удерживать сокеты в TIME_WAIT и загонять GC в ступор 🛠 Решение: 1. Запускаем профилировщик:

   dotnet-gcdump collect -p <PID>
   dotnet-gcdump analyze dump.gcdump
   
2. Смотрим типы с самым большим retained size: List<string>, byte[], MemoryStream → В коде — сериализация в JSON огромных объектов без ограничения глубины 3. Находим участок с JsonConvert.SerializeObject(hugeObject) без MaxDepth 4. Исправления: - Добавить настройки сериализации:

     new JsonSerializerSettings { MaxDepth = 5, ReferenceLoopHandling = Ignore }
     
- Ограничить MemoryCache по размеру:

     new MemoryCache(new MemoryCacheOptions { SizeLimit = 100_000_000 });
     
- Использовать HttpClientFactory вместо new HttpClient() на каждый запрос 5. Альтернатива: перейти на System.Text.Json с Utf8JsonWriter — меньше аллокаций 📌 Вывод: Даже без явных ошибок .NET-приложение может стабильно "утекать" в LOH — через сериализацию, кэш или неправильную работу с потоками. Только анализ дампа памяти и правильная конфигурация GC и кешей помогут найти такие проблемы. @csharp_1001_notes

⚡️ SQL-шпаргалка, которая выручит в интервью, проекте и проде Полный мастер-гайд по SQL в одном PDF: практичные примеры, чёткие объяснения и никакой воды. Что внутри: • 💬 Создание баз, таблиц и изменение схем • 💬 Запросы любого уровня сложности: JOIN, GROUP BY, HAVING, PARTITION • 💬 Подзапросы, CTE, оконные функции: ROW_NUMBER, RANK, DENSE_RANK • 💬 VIEW, временные таблицы и работа с дубликатами • 💬 Даты, строки, преобразования и агрегации • 💬 Очистка данных, разбиение по разделителям • 💬 UNION, INTERSECT, EXCEPT — управление сложными выборками Затрагиваются и продвинутые кейсы: • Парсинг адресов • Кастомная сортировка • Использование ISNULL и COALESCE 🧠 Это не просто набор команд — это концентрат боевого SQL-опыта. Подходит для: ➡️ Подготовки к SQL-интервью ➡️ BI и аналитики ➡️ Web-разработки с базами ➡️ Встраивания SQL в проекты на Python, Go, Java и других языках

Какой язык более читаемый: C# или Python? Программисты забивают на безопасность? Обсуждаем эти и другие холиварные темы в шоу Контура «Согласен — не согласен», где сталкиваются два представителя разных IT-профессий, каждый со своим мнением и бэкграундом. Cмотрите самые горячие выпуски🔥 ➡️ С# vs Python-разработчики: какой язык круче ➡️ Джун vs cеньор-разработчики: нужны ли джуны в бигтехе ➡️ Бэкендер vs фронтендер: кто больше страдает ➡️ Программист vs учитель информатики: делать ли программирование обязательным в школе ➡️ Безопасник vs программист: кто должен думать об уязвимости продукта Новые дискуссии выходят в канале @KonturTech каждые две недели. Будет эмоционально, но с уважением. 16+. Реклама. АО «ПФ «СКБ Контур», ОГРН 1026605606620. 620144, Екатеринбург, ул. Народной Воли, 19А. Erid: 2SDnjcTtt77

🔥 From C# to Rust: 42-дневный челлендж от Chris Woody Woodruff Chris Woodruff, экспериментающий .NET-разработчик, объявил ст
🔥 From C# to Rust: 42-дневный челлендж от Chris Woody Woodruff Chris Woodruff, экспериментающий .NET-разработчик, объявил старт своего 42-дневного пути погружения в Rust — язык системного программирования, совмещающий производительность, безопасность и отсутствие null:contentReference[oaicite:0]{index=0}. 🎯 Цели проекта - Жить и дышать Rust — по одному уроку в день. - Противостоять строгому borrow checker. - Осознанно учиться и делиться выводами от лица C#-разработчика. 🛠 Что ожидается изучить - Владение памятью, шаблоны, трейты, времена жизни (`lifetimes`). - Яркие сравнения Rust и C#: синтаксис, ownership vs GC, ошибки компилятора:contentReference[oaicite:2]{index=2}. - Краткие ежедневные отражения из .NET-мира. 📅 Примерный план на 42 дня 1. День 1–7: Почему Rust? Установка, cargo new vs dotnet new, "Hello, World!", переменные, функции:contentReference[oaicite:4]{index=4}. 2. День 8–14: Неделя владения — темы: ownership, borrowing, borrow checker:contentReference[oaicite:5]{index=5}. 3. День 15–42: Структуры, перечисления (`enum`), match, Option<T>, Result<T, E>, модули, ошибки, трейты, дженерики, лямбды и многое другое. 💬 Голос из сообщества > «What happens when a C# dev swaps null for Option, garbage collection for ownership… You get 42 days of brain‑bending, compiler‑fighting…» ✨ Подытожим - Проект идёт с апреля 2025 года, уже опубликованы десятки дневных эссе. - Каждая запись по мотивам реального опыта: «why won’t this compile?!», сравнения с привычным C#. - В финале — обзор полученного опыта, личные инсайты и примеры рабочего CLI‑приложения на Rust:contentReference[oaicite:8]{index=8}. 🚀 Готовы бросить вызов себе и глубже понять Rust? Следите за дневником Woody и за входом в мир безопасных без‑GC систем прямо с .NET-опытов! 🔗 Подробнее: From C# to Rust: A 42-Day Developer Challenge https://woodruff.dev/from-c-to-rust-a-42-day-developer-challenge/

ХОЧЕШЬ ПОВЫСИТЬ ГРЕЙД В 2025 ГОДУ? 🚀 Чтобы стать Senior C# разработчиком сегодня, нужно не только знать язык программировани
ХОЧЕШЬ ПОВЫСИТЬ ГРЕЙД В 2025 ГОДУ? 🚀 Чтобы стать Senior C# разработчиком сегодня, нужно не только знать язык программирования и фреймворки. Нужно уметь строить гибкую архитектуру приложения, которую легко тестировать и менять под задачи бизнеса. Стань экспертом в построении гибкой архитектуры приложения! 👉 Стартуем 2 июня. Курс ведет действующий архитектор и Principal Engineer Кирилл Ветчинкин. Ты научишься: ✅ Разбивать приложение на слои в соответствии с Clean Architecture ✅ Формировать Domain Model и применять тактические паттерны DDD ✅ Реализовывать Use Case как Command/Query ✅ Делать синхронные и асинхронные интеграции, не загрязняя ядро приложения ✅ Писать 3 вида тестов для разных слоев приложения Полная программа ТУТ 👉 https://microarch.ru/courses/ddd?utm_source=posev&utm_medium=erid:2VtzqwTjbcd&utm_campaign=5 А главное — ты с нуля разработаешь и запустишь микросервис, который максимально приближен к реальности "Диспетчеризация заказов на курьеров". Это будет крутым проектом в портфолио или основой для рабочих задач. А еще: ✅ Проверим все домашки ✅ Поддержим в чате ✅ Проведем живые разборы ✅ Ответим на все вопросы 📕 Сертификат об участии по итогам прохождения курса. 🔥 Не откладывай свой рост на потом: https://microarch.ru/courses/ddd?utm_source=posev&utm_medium=erid:2VtzqwTjbcd&utm_campaign=5 Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwTjbcd