ch
Feedback
C# 1001 notes

C# 1001 notes

前往频道在 Telegram

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

显示更多
6 607
订阅者
+624 小时
+487
+3730
帖子存档
⚡ Race Conditions в ASP.NET Core - как они появляются и почему их сложно ловить В статье Assis Zang разбирается, что происходит, когда несколько запросов одновременно работают с общим состоянием и начинают вмешиваться друг в друга. Внутри: - откуда берутся race conditions - почему проблема может проявляться нестабильно - как воспроизвести конкурентный доступ - какие ошибки возникают при работе с shared state - как использовать синхронизацию и безопасные паттерны - почему потокобезопасность важна даже в обычном web API Полезно для .NET-разработчиков, которые работают с многопоточностью, shared state и высоконагруженными ASP.NET Core-приложениями. https://telerik.com/blogs/understanding-race-conditions-aspnet-core

Repost from Machinelearning
✔️ Hugging Face прощупывает интерес покупателей Платформа для хостинга моделей и датасетов наняла банки, чтобы выяснить, готов ли кто-нибудь купить бизнес. Речь пока не о сделке - тестирование рынка может закончиться и новым раундом финансирования. По данным источников, сейчас компанию оценивают примерно в 1,3 млрд долларов, тогда как в 2023 году оценка доходила до 4,5 млрд, - за три года почти в три с половиной раза ниже. Наиболее вероятными покупателями называют нынешних инвесторов Hugging Face - Google, Amazon, Nvidia, Intel и Salesforce. bloomberg.com ✔️ Alibaba запустила видеогенератор Wan3.0 Модель собирает тридцатисекундные ролики из текстовых документов, таблиц, презентаций и веб-страниц. В новой версии лучше работают референсы и реконструкция реальных объектов, а базовая длина ролика выросла. Alibaba целится в производство рекламы, коротких сериалов и музыкальных клипов. До официального запуска модель была в открытой бете. Иностранцы получают доступ к API через Alibaba Cloud. Секунда видео стоит 10 центов в 720p и 20 центов в 1080p, то есть полный тридцатисекундный ролик в 1080p обойдется в 6 долларов. reuters.com ✔️ Antigravity теперь управляется с телефона Агентом можно рулить со смартфона или из браузера, ничего дополнительно не устанавливая. В интерфейсе видно сессии в реальном времени, туда же ставятся задачи и оттуда проверяются результаты. На телефон приходят уведомления, когда агент закончил работу или ждет от человека подтверждения. Подключиться можно сразу к нескольким машинам и быстро между ними переключаться, причем монитор хосту не нужен - Antigravity запускается и работает и без него. Обновление раскатывают постепенно, первыми его получают подписчики Google AI Ultra. antigravity.google ✔️ FDA впервые разрешило автономного робота для забора крови Американский регулятор выдал разрешение по процедуре системе Aletta голландского стартапа Vitestro. Робот делает всю процедуру сам: накладывает жгут, дезинфицирует кожу, находит вену, вводит иглу, меняет пробирки, убирает расходники и заклеивает прокол. Вены он ищет ближней инфракрасной съемкой, ультразвуком и допплерографией - ими же отличает вену от артерии. В клинических испытаниях на 1600 пациентах игла попадала с первой попытки в 94,5% случаев. Aletta рассчитана на амбулаторный прием взрослых. Один оператор может вести сразу три таких аппарата. fda.gov ✔️ В Южной Корее микроэлектроника догоняет медицину по конкурсу в ВУЗы На фоне ИИ-бума корейские абитуриенты пошли в микроэлектронику. По данным Jongno Academy, частного центра подготовки к поступлению, средний проходной балл на профильные специальности в ведущих вузах дошел до 96,2. Медицинские факультеты, где конкурс исторически самый высокий в стране, держат 97,2. Университеты вместе с Samsung Electronics и SK Hynix запускают целевые программы с гарантированным трудоустройством. А школьники, чтобы поступить на инженерные направления, все лето занимаются в специализированных центрах Сеула. ft.com @ai_machinelearning_big_data #news #ai #ml

⚡️Актуальные темы .NET на DotNext 2026 В .NET одновременно происходит много интересного: C# получает новые возможности, .NET
+4
⚡️Актуальные темы .NET на DotNext 2026 В .NET одновременно происходит много интересного: C# получает новые возможности, .NET 10 меняет расклад между Native AOT и JIT, а в разработке появляются ИИ-агенты, которые берут на себя часть инженерной работы. На DotNext 2026 разберем как вещи, которые происходят на уровне машинного кода, так и вполне прикладные вопросы архитектуры и разработки. 📅 25–26 сентября, Москва + online Выбрали 8 тем из программы, среди которых не только доклады, но и хардкорный воркшоп, чтобы показать этот диапазон: — как заставить Transactional Outbox одновременно быть строгим и параллельным; — зачем ASP.NET Core модульный монолит и как собрать его без микросервисов; — где Native AOT выигрывает у JIT в .NET 10; — что происходит с циклами, inlining и bounds checks в C# и Go; — как меняется SDLC, когда в команде появляются ИИ-агенты; — что принесут discriminated unions в C# 15; — как проектировать асинхронное взаимодействие в распределенных системах (воркшоп). Все подробности — в карточках и на сайте конференции. 🌟По промокоду csharp1001notes — персональные билеты дешевлеПрограмма DotNextКупить билет

Rate Limiting и Throttling API в .NET В ASP.NET Core есть встроенные механизмы, которые помогают защитить API от перегрузки и
Rate Limiting и Throttling API в .NET В ASP.NET Core есть встроенные механизмы, которые помогают защитить API от перегрузки и слишком частых запросов. Можно ограничивать трафик: — по IP — по пользователю — по endpoint — по фиксированному окну — через sliding window — token bucket — concurrency limiter Это полезно не только против DDoS. Rate limiting помогает не дать одному клиенту забить весь сервис, защитить дорогие операции и стабилизировать нагрузку на БД и внешние API. В .NET это можно настроить прямо в middleware без сторонних библиотек. Хороший разбор с примерами: https://tundehub.dev/rate-limiting-and-throttling-apis-in-net #aspnetcore #dotnet

Архитектурные ошибки, которые совершают даже опытные C#-разработчики Можно соблюдать SOLID, использовать паттерны и современн
Архитектурные ошибки, которые совершают даже опытные C#-разработчики Можно соблюдать SOLID, использовать паттерны и современные архитектурные подходы — и всё равно со временем получить систему, которую сложно и дорого поддерживать. Почему так происходит? Где заканчивается хорошая архитектура и начинается оверинжиниринг? И какие решения, которые сегодня кажутся правильными, завтра становятся источником технического долга? 18 августа в 20:00 МСК на открытом вебинаре OTUS вместе с Антоном Герасименко разберём архитектурные ошибки, которые регулярно встречаются в реальных .NET-проектах. Вы узнаете, как отличать действительно полезные архитектурные решения от «архитектуры ради архитектуры» и проектировать системы, которые можно развивать без постоянных дорогостоящих переделок. Вебинар проходит в преддверии старта курса «C#-разработчик. Продвинутый уровень». Регистрируйтесь: https://otus.pw/fvrf/?erid=2W5zFHT5e3T Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

⚡️ C#-приём: не привязывай метаданные к объектам через обычный `Dictionary` — иногда нужен `ConditionalWeakTable`. Допустим, библиотека кеширует данные о типах:

private static readonly Dictionary<Type, Metadata> Cache = new();
В обычном приложении это может годами работать без проблем. Но если используются plugins, dynamic assemblies или unloadable AssemblyLoadContext, такой словарь способен удерживать Type, а вместе с ним — всю загруженную сборку. И получить memory leak. Для таких случаев в .NET есть малоизвестный:

ConditionalWeakTable<TKey, TValue>
Пример:

private static readonly ConditionalWeakTable<Type, Metadata> Cache = new();

static Metadata GetMetadata(Type type)
{
    return Cache.GetValue(type, BuildMetadata);
}
Ключ здесь хранится слабо. Если Type больше нигде не нужен, GC может его собрать, а связанная запись автоматически исчезнет из таблицы. Это особенно полезно для: * reflection-кешей; * proxy/framework-кода; * source/runtime metadata; * plugin-систем; * приложений с AssemblyLoadContext. 🔥 Если видишь:

static Dictionary<Type, ...>
или

static ConcurrentDictionary<Type, ...>
в коде, который работает с динамически загружаемыми сборками, стоит проверить: не удерживает ли этот кеш сборки в памяти навсегда? Иногда правильный ответ — ConditionalWeakTable. #CSharp #DotNet #Backend #Programming #CLR

🎓 Скоро заканчивается прием документов на онлайн-магистратуру ИТМО в партнерстве с Яндекс Практикумом «Фронтенд-, бэкенд‑раз
🎓 Скоро заканчивается прием документов на онлайн-магистратуру ИТМО в партнерстве с Яндекс Практикумом «Фронтенд-, бэкенд‑разработка и ИИ‑решения» Это двухлетняя программа, где обучение проходит полностью онлайн с лекциями по вечерам. Нагрузка адаптируется под ваш уровень, сохраняются все статусы и льготы очной формы. После выпуска выдается диплом магистра ИТМО и диплом о профпереподготовке от Яндекса. Что внутри: • 9 треков на выбор по уровню и стеку: 4 базoвых (JS, Python, Java, C++) и 5 продвинутых — с упором на асинхронность, микросервисы, высокое нагружение, Kafka, C++/Boost, NestJS, Spring Boot. • Упор на практику на основе реальных задач партнеров программы и сервисов Яндекса, также есть возможность вести собственный рабочий проект. На выходе получите 10+ кейсов в портфолио. • Интеграция ИИ в разработку: автоматизация рутинных задач (генерация кода, написание тестов, дебаггинг, документация) и промпт-инжиниринг на всех треках. • Специализированный трек «ИИ-решения в разработке»: проектирование систем на базе LLM, сборка RAG-пайплайнов, работа с мультиагентными сетями и внедрение AI-компонентов в продакшен. Подать заявление можно также онлайн. Отбор проходит одним из способов: по рекомендательному письму для выпускников курсов Практикума или через вступительные экзамены. 📌 Подробности о программе.

🚀 C# 15 меняет подход к `unsafe`: указатели больше не означают автоматически опасный код Раньше в C# сам факт использования указателя требовал:

unsafe
{
    int* ptr;
}
Теперь язык движется к более точной модели: опасным считается не наличие указателя, а операция, которая реально работает с unmanaged-памятью. В preview-версии C# 15 уже не требуют unsafe: ✅ объявление pointer-типа ✅ получение адреса через &fixed для закрепления памяти ✅ преобразование stackalloc в указатель ✅ sizeof для unmanaged-типов Пример:

int number = 42;

int* pointer = &number;

int[] numbers = [10, 20, 30];

fixed (int* first = numbers)
{
    // само закрепление памяти безопасно
}
Но вот это всё ещё требует unsafe:

*pointer;        // dereference
pointer->Value; // доступ через указатель
pointer[0];     // работа с элементами
delegate*<>     // вызов function pointer
Главная идея: **создать инструмент можно безопасно. Опасно — когда начинаешь напрямую менять память.** Это первый этап большой переработки модели безопасности C#. Дальше ожидаются: - requires-unsafe для отдельных членов; - opt-in на уровне assembly; - новый safe keyword. C# постепенно делает unsafe-код более точечным: меньше блоков вокруг всего файла, больше внимания к реально опасным операциям. #csharp #dotnet #programming

🔥 EF Core migrations - это компилятор схемы базы, а не кнопка «создать таблицу» Опытный C#-разработчик не оставляет бизнес-инварианты только внутри SaveChangesAsync(). Проверку в приложении можно обойти прямым SQL, импортом данных, фоновым процессом или второй версией сервиса. Поэтому правила, нарушение которых делает данные некорректными, стоит закреплять в самой базе.

public sealed class ProductConfiguration
    : IEntityTypeConfiguration<Product>
{
    public void Configure(EntityTypeBuilder<Product> builder)
    {
        builder.ToTable("Products", table =>
        {
            table.HasCheckConstraint(
                "CK_Products_Price_Range",
                "[Price] > 0 AND [Price] <= 10000000");
        });

        builder.Property(x => x.Name)
            .HasMaxLength(200)
            .IsRequired();

        builder.Property(x => x.NormalizedName)
            .HasMaxLength(200)
            .IsRequired();

        builder.Property(x => x.Price)
            .HasPrecision(18, 2);

        builder.HasIndex(x => x.NormalizedName)
            .IsUnique()
            .HasDatabaseName("UX_Products_NormalizedName");
    }
}
HasPrecision(18, 2) управляет физическим представлением decimal, но не проверяет допустимый диапазон цены. За это отвечает CHECK. Уникальный индекс решает другую важную проблему - гонку между запросами.

if (!await db.Products.AnyAsync(x => x.Name == name))
{
    db.Products.Add(product);
    await db.SaveChangesAsync();
}
Два параллельных запроса могут одновременно пройти AnyAsync() и попытаться создать одинаковые записи. Только уникальное ограничение базы гарантированно остановит второй запрос. Использовать для уникальности исходный Name тоже опасно. Результат будет зависеть от collation базы: Laptop, LAPTOP и Laptop могут считаться одинаковыми или разными. Поэтому часто сохраняют нормализованное значение:

product.NormalizedName = product.Name
    .Trim()
    .ToUpperInvariant();
После изменения модели создаём миграцию:

dotnet ef migrations add HardenProductSchema
Но миграцию нельзя принимать вслепую. EF Core сравнивает текущую модель с ModelSnapshot и генерирует предполагаемый переход между двумя состояниями. Например, обычное переименование свойства может быть распознано как удаление старого столбца и создание нового:

migrationBuilder.DropColumn(
    name: "Name",
    table: "Products");

migrationBuilder.AddColumn<string>(
    name: "DisplayName",
    table: "Products",
    nullable: false);
В production это означает потерю данных. Правильную операцию нужно указать вручную:

migrationBuilder.RenameColumn(
    name: "Name",
    table: "Products",
    newName: "DisplayName");
Для крупных таблиц полезен подход expand -> backfill -> contract. Сначала добавляется nullable-столбец:

migrationBuilder.AddColumn<string>(
    name: "NormalizedName",
    table: "Products",
    type: "nvarchar(200)",
    nullable: true);
Затем данные заполняются порциями отдельной задачей. После обновления всех строк новая версия приложения начинает записывать оба значения. И только в следующем релизе столбец переводится в NOT NULL, добавляется индекс и удаляется устаревшая логика. Так миграция не держит долгую блокировку и остаётся совместимой сразу с несколькими версиями приложения. В CI стоит проверять, не забыл ли разработчик создать миграцию:

dotnet ef migrations has-pending-model-changes
Для production лучше генерировать проверяемый SQL:

dotnet ef migrations script \
    --idempotent \
    --output migrations.sql
Либо собирать отдельный executable:

dotnet ef migrations bundle \
    --self-contained \
    -r linux-x64
efbundle можно запускать в deployment job без исходников проекта и установленного EF CLI.

🚀 Claude Opus 5 за 24 часа собрал собственный космический симулятор Разработчик запустил модель на одну непрерывную сессию и получил The Long Silence - полноценную браузерную игру об исследовании космоса. По словам автора, весь код, визуал и звук создал Claude. Внутри: • процедурные звёзды, планеты, кольца и туманности • посадка на поверхность планет • перелёты между системами и fold drive • сканирование объектов, станции и заброшенные корабли • карта галактики, сюжет и архив найденных данных • динамическое масштабирование графики для стабильных 60 FPS Игра работает на WebGL2 без готовых ассетов: миры генерируются из seed, графика написана на GLSL, а музыка и звук создаются процедурно. Это ещё не Starfield по масштабу, но для проекта, собранного моделью за сутки, результат выглядит безумно. 🎮 Код и запуск: https://github.com/achimala/TheLongSilence 🌐 Запустить в браузере: https://longsilence.anshu.dev/

AI-инструменты уже умеют быстро писать код, но для C#-разработчика это не отменяет экспертизу, а делает её важнее. Теперь нуж
AI-инструменты уже умеют быстро писать код, но для C#-разработчика это не отменяет экспертизу, а делает её важнее. Теперь нужно не просто получить подсказку от ассистента, а понять, где она корректна, где скрывает ошибку и какие последствия принесёт в .NET-приложении. 5 августа в 20:00 МСК на открытом вебинаре OTUS разберём, как использовать AI так, чтобы становиться сильнее как C#-разработчик, а не зависеть от автогенерации. Покажем, где AI действительно ускоряет работу Middle/Senior: рефакторинг, генерация тестов, разбор legacy-кода, объяснение стектрейсов и поиск направлений для улучшения. Отдельно посмотрим на зоны, где ассистенты часто ошибаются: потокобезопасность, работа с IDisposable, производительность LINQ, тонкости DI и конфигурации. Урок проходит в преддверии старта курса «C#-разработчик. Продвинутый уровень». 👉 Регистрируйтесь: https://otus.pw/ZmAS/?erid=2W5zFHwJ5Qu Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

.NET 11 готовят под эпоху AI Microsoft собрала ключевые .NET-сессии с Build 2026. Фокус - AI, агенты и развитие C#. Что показ
.NET 11 готовят под эпоху AI Microsoft собрала ключевые .NET-сессии с Build 2026. Фокус - AI, агенты и развитие C#. Что показали: - union types в C#; - улучшения runtime, SDK и производительности в .NET 11; - инструменты для добавления AI в C#-приложения; - agentic web в ASP.NET Core и Blazor; - локальные AI-модели и on-device inference через .NET MAUI; - новый dotnetup для установки и обновления SDK/runtime. Важно: .NET 11 пока находится в preview, а часть возможностей ещё развивается. https://devblogs.microsoft.com/dotnet/dotnet-at-microsoft-build-2026/

Каждый год в середине лета мы с друзьями собираемся на E-CODE. Ещё относительно молодая конфа Ozon Tech стала уже своего рода
+1
Каждый год в середине лета мы с друзьями собираемся на E-CODE. Ещё относительно молодая конфа Ozon Tech стала уже своего рода легендой. Не удивительно: хардовость официальной части здесь не уступает громкости афтерпати. На E-CODE 2026 нас по части бэкэнда ждут: • Runtime Async с его + и – • трассировка с eBPF • ускорение на SIMD • построение кастомной real-time системы видеоаналитики • сравнительный анализ алгоритмов сборки мусора Фишка этого года — брейнринг разработчиков и ИИ. Эксперты разберут сложные кейсы и сравнят свои подходы с тем, что предложит машина. Победителя выберет зал. Регистрируйтесь сейчас, чтобы услышать это всё вживую: https://ecode.ozon.tech/

🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку В IT прокачивается тот, кто каждый день видит сильные идеи, новые инс
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку В IT прокачивается тот, кто каждый день видит сильные идеи, новые инструменты, реальные задачи, вакансии и разборы. Окружение решает больше, чем кажется. Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре. AI: t.me/ai_machinelearning_big_data Python: t.me/pythonl Linux: t.me/linuxacademiya Хакинг: t.me/linuxkalii DevOps: t.me/DevOPSitsec Docker: t.me/DevopsDocker Golang: t.me/Golang_google Rust: t.me/rust_code C++: t.me/cpluspluc C#: t.me/csharp_1001_notes Java: t.me/java_library JavaScript: t.me/javascriptv React: t.me/react_tg Frontend: t.me/front PHP: t.me/phpshka Android: t.me/android_its Мобильная разработка: t.me/mobdevelop Базы данных: t.me/sqlhub Data Science: t.me/data_analysis_ml Big Data: t.me/bigdatai Математика: t.me/data_math Физика: t.me/fizmat Kubernetes: t.me/kubernetc GameDev: https://t.me/gamedev Haskell: t.me/haskell_tg Собеседования и карьера: DS собеседования: t.me/machinelearning_interview Python собеседования: t.me/python_job_interview Папка с вакансиями: 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 ГБ open-source курсов: @courses ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy Max Ai: https://max.ru/ai_machinelearning_big_data Max python: https://max.ru/pythonl ТЕХНО: https://max.ru/vistehno Max Go: https://max.ru/Golang_google Max Linux: https://max.ru/linuxkalii Devops: https://max.ru/DevOPSitsec C#: https://max.ru/csharp_ci C++: https://max.ru/cpluspluc SQL: https://max.ru/sqlhub Java: https://max.ru/javatg Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд. Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.

Полезный Docker-трюк для .NET: кэшируйте NuGet-пакеты через BuildKit, а не скачивайте их заново при каждой сборке.

# syntax=docker/dockerfile:1.7

FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src

COPY *.csproj .
RUN --mount=type=cache,target=/root/.nuget/packages \
    dotnet restore

COPY . .
RUN --mount=type=cache,target=/root/.nuget/packages \
    dotnet publish -c Release -o /app
NuGet-кэш не попадает в финальный image, но между сборками сохраняется. В итоге restore работает быстрее, особенно в CI, где зависимости обычно весят больше, чем сам код.

⚡️ GPT-5.6 РЕЛИЗ OpenAI выкатили сразу три новые модели. • Sol - заявлено, что модель мощнее Mythos. Доступ для платных польз
⚡️ GPT-5.6 РЕЛИЗ OpenAI выкатили сразу три новые модели. • Sol - заявлено, что модель мощнее Mythos. Доступ для платных пользователей обещают в течение 24 часов. На Terminal Bench 2.1 с настройкой Ultra модель выбивает рекордные 91,9%. Первые тестеры отдельно отмечают сильную работу с интерфейсами: она уверенно собирает UI для приложений и сайтов, а не просто генерирует сырой код. • Terra - уровень Fable 5. Будет доступна бесплатно. • Luna - еще одна бесплатная модель для всех. Помимо самой модели, показали 3 крупных продуктовых обновления: 1. ChatGPT Work 2. новое desktop-приложение ChatGPT 3. hosted sites, то есть размещение сайтов прямо через Chatgpt https://openai.com/ru-RU/live/

AI-инструменты стали стандартной частью стека C#/.NET-разработчиков: ассистенты в IDE, генерация кода и тестов, помощь с доку
AI-инструменты стали стандартной частью стека C#/.NET-разработчиков: ассистенты в IDE, генерация кода и тестов, помощь с документацией и ревью. По данным отраслевых отчётов, 80–90% инженеров уже используют AI-сервисы, а 97% компаний встроили AI в SDLC. Однако разрыв сегодня проходит не по доступу к моделям. У одних команд AI встроен в мультиагентные пайплайны, SDD подход и метрики качества. У других остаётся локальным помощником без влияния на метрики, скорость релизов и риск-профиль. Именно для интеграции AI в процессы команда Naition запускает 12‑недельную программу по AI-driven разработке. Программу собрали инженеры и техлиды из Яндекс Cloud, Сбера, Google и других продуктовых команд с опытом более 15 лет. Что внутри:
• создание AI-окружения под ваш стек • контекст-инжиниринг - от создания и подключения кастомных MCP до RAG под вашу кодовую базу • решение продуктовых задач, spec-driven разработка и контроль качества с evals • разработка агентов, сабагентов с выходом в практики оркестрации • практики работы с легаси-проектами и крупными кодовыми базами при ограниченном бюджете
Форматы участия: Командный - для C#/.NET-команд от 3–5 человек. Заходите в общий поток и получаете отдельный трек: разбор текущих процессов, выделение узких мест, план внедрения AI-практик и фиксация метрик до и после изменений. Индивидуальный формат - для архитекторов, техлидов, middle/senior‑разработчиков и руководителей, которые хотят собрать язык и паттерны AI‑ориентированной разработки, чтобы затем использовать их как основу изменений внутри своих команд. 95% участников прошлого потока дошли до конца. Первые изменения в процессах команды вносили уже после второго модуля. Новый поток AI‑DRIVEN стартует 21 июля. Если вы отвечаете за архитектуру и метрики разработки в C#/.NET‑проектах, вы можете оставить заявку на сайте и до 13 июля получить индивидуальные условия участия для команды или для себя как индивидуального участника. Подробности на сайте: naition.ai Реклама: ИП Крутов Дмитрий Валерьевич ИНН: 772973192199 Erid: 2VtzqxRqZmC

Record-типы в C#: когда модель данных не должна быть обычным class record в C# удобен там, где объект описывает данные, а не поведение и идентичность. Типичный пример:

public record User(string Name, int Age);
Компилятор сам сгенерирует конструктор, Equals, GetHashCode, ToString и деконструкцию. Но главное отличие не в сокращении кода, а в семантике. Обычный class сравнивается по ссылке:

var a = new UserClass("Alice", 25);
var b = new UserClass("Alice", 25);

Console.WriteLine(a == b); // false
record сравнивается по значению:

var a = new User("Alice", 25);
var b = new User("Alice", 25);

Console.WriteLine(a == b); // true
Это делает record хорошим выбором для DTO, read models, value objects, событий, результатов запросов и моделей, где важны значения полей. Ещё одна удобная вещь - with. Можно создать копию объекта, изменив только нужные поля:

var user = new User("Alice", 25);

var updated = user with { Age = 26 };

Console.WriteLine(updated);
// User { Name = Alice, Age = 26 }
Но есть важный нюанс: with делает поверхностную копию. Если внутри есть изменяемая коллекция, она не станет автоматически immutable.

public record Team(string Name, List<string> Members);
Такой record всё ещё может меняться через Members.Add(...). Поэтому для реально неизменяемых моделей лучше использовать immutable-коллекции или аккуратно закрывать доступ к изменяемому состоянию. record не заменяет class везде. Если у объекта есть жизненный цикл, identity, состояние и бизнес-поведение, обычный класс часто будет честнее. Но когда тип нужен как чистая модель данных, record убирает шум и делает намерение в коде очевидным.

Методы, их перегрузка и расширения. Бесплатный урок специализации «C#-разработчик» Методы — одна из базовых вещей в C#, без к
Методы, их перегрузка и расширения. Бесплатный урок специализации «C#-разработчик» Методы — одна из базовых вещей в C#, без которой невозможно нормально писать, читать и поддерживать код. Но у начинающих разработчиков часто всё смешивается: где обычный метод, где перегрузка, как работает сигнатура, зачем нужны параметры по умолчанию и в каких случаях использовать params. На открытом уроке 2 июля в 20:00 разберём, что такое метод в C#, как писать собственные методы и как использовать перегрузку без хаоса в коде. Поговорим о сигнатуре метода, параметрах по умолчанию, ключевом слове params и методах-расширениях. На примерах покажем, как эти механики помогают делать код понятнее, гибче и удобнее для повторного использования. Урок не для тех, кто хочет просто «выучить синтаксис» без понимания, как методы влияют на структуру программы. 👉 Записаться: https://otus.pw/wkKs/?erid=2W5zFG7dRZ3 Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Продвинутый C#-трюк: обновляй `Dictionary` без двойного поиска Многие пишут так:

if (dict.TryGetValue(key, out var value))
{
    dict[key] = value + 1;
}
else
{
    dict[key] = 1;
}
Проблема: ты сначала ищешь ключ через TryGetValue, а потом снова лезешь в словарь через dict[key]. В hot path это лишняя работа. Есть более взрослый вариант:

using System.Runtime.InteropServices;

ref var count = ref CollectionsMarshal.GetValueRefOrAddDefault(
    dict,
    key,
    out var exists
);

if (!exists)
{
    count = 0;
}

count++;
Что происходит: 1. C# получает ссылку прямо на значение внутри Dictionary 2. ключ ищется один раз 3. значение можно менять без повторного обращения 4. меньше лишних операций в tight loop Где это полезно: 1. счётчики событий 2. парсеры 3. агрегации 4. обработка логов 5. high-performance backend code Но есть важный нюанс: не меняй структуру словаря, пока держишь ref. То есть не делай Add, Remove, Clear рядом с этой ссылкой. Это не трюк для каждого CRUD-сервиса. Это инструмент для мест, где C# уже упёрся в производительность, и ты начинаешь выжимать лишние аллокации и лишние lookup’и.