Start Debugging

Возможности C# 14

Что на самом деле вошло в C# 14, с кодом.

Эта подборка собирает всё, что я писал о возможностях языка C# 14: union-типы, partial-конструкторы и события, extension-типы и мелкие эргономические улучшения, которые легко пропустить в официальных release notes.

С чего начать

Если вы переходите с C# 12, начните со статей об union-типах и partial-членах - это самые заметные изменения поведения. Остальное - улучшения удобства.

Что на этой странице

Список ниже автоматически собирает статьи с любым из тегов: c# 14, csharp 14, c#, csharp, c# language. Сначала самые новые.

Указатель (196 статей)

2026 / 06

  • Как объявить свойства расширения в C# 14

    Свойства расширения появляются в C# 14 через новый блок extension. Объявляйте свойства расширения только для чтения, с сеттером, статические и обобщённые, почему автосвойства отвергаются и как компилятор преобразует их в аксессоры get_/set_.

  • Как реализовать keyset-пагинацию (cursor pagination) в EF Core 11

    Замените Skip/Take на WHERE, который перескакивает за последнюю увиденную строку. Сортируйте по полностью уникальному ключу, переносите значения последней строки как курсор, и EF Core 11 превратит следующую страницу в поиск по индексу вместо сканирования с OFFSET.

  • Как регистрировать и разрешать сервисы с ключом во внедрении зависимостей .NET 11

    Зарегистрируйте несколько реализаций одного типа сервиса под ключом с помощью AddKeyedSingleton/Scoped/Transient, а затем разрешите их через [FromKeyedServices], GetRequiredKeyedService или KeyedService.AnyKey. Регистрации с ключом и без ключа находятся в раздельных таблицах, и именно это сбивает с толку почти всех.

  • Как валидировать издателя, аудиторию и срок действия JWT в ASP.NET Core 11

    Полное руководство по TokenValidationParameters в ASP.NET Core 11: как работают ValidateIssuer, ValidateAudience и ValidateLifetime, какие на самом деле значения по умолчанию, почему Authority автоматически настраивает издателя и ключи подписи, ловушка ClockSkew в 5 минут и как читать коды ошибок IDX, когда отклоняется на вид валидный токен.

  • Закрытые иерархии классов в C# 15: ключевое слово closed в .NET 11 Preview 5

    C# 15 добавляет модификатор closed в .NET 11 Preview 5, давая иерархиям классов проверку полноты во время компиляции в выражениях switch. Как это работает и единственный подводный камень.

  • Как настроить CORS для защищённого JWT API в ASP.NET Core 11

    Полное руководство по CORS для API с токеном bearer в ASP.NET Core 11: правильный порядок UseCors относительно аутентификации, почему токен bearer в заголовке Authorization не является учётными данными CORS, почему AllowAnyHeader работает, а ручной шаблон не покрывает Authorization, и как не дать предварительному запросу завершиться сбоем.

  • Как засеять связь многие-ко-многим в EF Core 11

    Заполнение таблицы связки для отношения многие-ко-многим в EF Core 11: неявные теневые ключи, которые нужно именовать вручную, шаблон UsingEntity HasData и альтернатива UseSeeding во время выполнения, работающая с навигациями пропуска.

  • Как заполнять данные с помощью UseSeeding и UseAsyncSeeding в EF Core 11

    Заполняйте справочные данные правильно в EF Core 11 с помощью UseSeeding и UseAsyncSeeding: где их настраивать, когда они выполняются, какую проверку идемпотентности нельзя пропускать и почему нужно реализовать обе.

  • Что такое Span<T> в C# и когда он действительно ускоряет ваш код?

    Span<T> -- это ref struct, живущий только в стеке и указывающий на память, которой вы уже владеете, поэтому у него нет собственной аллокации. Он ускоряет код ровно в трёх ситуациях: замена буфера в куче на stackalloc, нарезка без копирования и плотные циклы, где JIT убирает проверки границ. В остальных случаях он ничего не меняет, а через await он не компилируется.

  • Что такое атрибут DynamicallyAccessedMembers?

    DynamicallyAccessedMembers сообщает триммеру .NET и AOT-компилятору, к каким членам типа Type вы обращаетесь через рефлексию, чтобы они были сохранены, а не удалены при тримминге. Он превращает молчаливое исключение MissingMethodException во время выполнения в предупреждение IL2070 на этапе сборки. Вот что делает этот атрибут, как работает лежащий в его основе анализ потока данных и как правильно аннотировать параметры, поля и параметры обобщённых типов.

  • Что такое ValueTask<T> и когда он того стоит?

    ValueTask и ValueTask<T> -- это структуры, которые позволяют асинхронному методу вернуть результат без выделения Task в куче, когда он завершается синхронно. Выигрыш -- одно выделение памяти меньше на горячих путях, которые обычно завершаются без ожидания. Цена -- строгий контракт ожидания ровно один раз. Вот что этот тип представляет собой на самом деле, как он работает и тот узкий набор случаев, где он оправдывает себя.

  • Что такое генератор исходного кода и когда он мне нужен?

    Понятное руководство по генераторам исходного кода в C#: что они на самом деле делают, как работает пайплайн IIncrementalGenerator, когда они выигрывают у рефлексии или T4 и в каких случаях к ним не стоит прибегать. С работающими примерами на .NET 11 и C# 14.

  • Что такое IAsyncEnumerable<T> и когда его следует использовать?

    IAsyncEnumerable<T> — это интерфейс для асинхронных потоков: последовательность, элементы которой поступают со временем и каждый из которых может потребовать await. Вот что это на самом деле, как await foreach и yield приводят его в движение, и правило, когда выбирать его вместо Task<List<T>>.

  • Что такое Native AOT и чего он вам стоит?

    Native AOT компилирует ваше .NET-приложение в единый автономный нативный бинарь без JIT, обеспечивая быстрый запуск и небольшое потребление памяти. Цена этого: цепочка инструментов C на этапе компиляции, более медленные публикации, сборки под каждый RID, отсутствие рефлексии и Reflection.Emit, обязательный тримминг и отсутствие Dynamic PGO. Вот полный баланс.

  • Blazor static SSR получает [SupplyParameterFromSession] в .NET 11 Preview 5

    Чтение состояния сессии в статически серверно отрендеренном Blazor означало обращение к HttpContext.Session и сериализацию вручную. .NET 11 Preview 5 добавляет [SupplyParameterFromSession] для привязки свойства компонента напрямую к ключу сессии.

  • AsNoTracking vs AsNoTrackingWithIdentityResolution в EF Core 11: что выбрать?

    Используйте AsNoTracking по умолчанию для запросов только на чтение. Прибегайте к AsNoTrackingWithIdentityResolution только тогда, когда граф результата содержит одну и ту же сущность несколько раз и ваш код полагается на получение единого общего экземпляра.

  • Новый анализатор EF1004 в EF Core 11 ловит скрытую асинхронную ошибку

    EF Core 11 Preview 5 включает анализатор EF1004. Он помечает вызов ToAsyncEnumerable() на IQueryable, чтобы вы случайно не выполнили запрос к базе данных синхронно внутри await foreach.

  • Согласование ключей X25519 встроено в .NET 11 Preview 5

    .NET 11 Preview 5 добавляет полноценный тип X25519DiffieHellman в System.Security.Cryptography, чтобы выполнять обмен ключами Curve25519 без BouncyCastle или NSec.

  • Исправление: The entity type 'X' requires a primary key to be defined в EF Core 11

    EF Core не может найти ключ для вашего типа. Назовите свойство Id или {Type}Id, добавьте [Key], вызовите HasKey или, если это представление либо сырой SQL, вызовите HasNoKey.

  • LINQ получает FullJoin и join без селектора в .NET 11 Preview 5

    .NET 11 Preview 5 добавляет в LINQ совершенно новый оператор FullJoin, а также перегрузки, возвращающие кортежи, для Join, LeftJoin, RightJoin и GroupJoin, которые полностью убирают селектор результата.

  • Статические SSR-формы Blazor получают валидацию на стороне клиента в .NET 11 Preview 5

    Статически рендеримые на сервере формы Blazor могли валидироваться только после полного POST-цикла. .NET 11 Preview 5 рендерит метаданные валидации, чтобы JS Blazor применял правила DataAnnotations в браузере, без circuit.

  • Исправление: The configured execution strategy 'SqlServerRetryingExecutionStrategy' does not support user-initiated transactions

    EnableRetryOnFailure конфликтует с BeginTransaction. Оберните всю транзакцию в db.Database.CreateExecutionStrategy().ExecuteAsync(...), чтобы она повторялась как единое целое.

  • System.Text.Json наконец-то пишет JSON Lines в .NET 11 Preview 5

    .NET 11 Preview 5 добавляет JsonSerializer.SerializeAsyncEnumerable с topLevelValues: true, поэтому System.Text.Json теперь умеет передавать JSONL потоком, а не только читать его.

  • Как сохранить состояние через границу статического и интерактивного рендеринга в Blazor на .NET 11

    Предварительно отрендеренный компонент Blazor выполняет инициализацию дважды и теряет состояние при переходе к интерактивности. Решите это с помощью атрибута [PersistentState] или сервиса PersistentComponentState в .NET 11.

  • Как отдать OpenAPI без Swashbuckle в ASP.NET Core 11

    Swashbuckle исчез из шаблонов ASP.NET Core. Вот как сгенерировать и отдать документ OpenAPI в .NET 11 со встроенным пакетом Microsoft.AspNetCore.OpenApi: AddOpenApi, MapOpenApi, трансформеры, несколько документов, генерация во время сборки и интерфейс поверх.

  • Как использовать перехватчики EF Core 11 для аудита

    Проставляйте столбцы CreatedBy/ModifiedOn и пишите полный журнал изменений с помощью ISaveChangesInterceptor в EF Core 11, включая время жизни в DI, текущего пользователя и подводные камни ExecuteUpdate.

  • GitHub Copilot SDK достиг GA: встройте среду выполнения агента Copilot в собственные приложения на C#

    На Build 2026 GitHub выпустил Copilot SDK 1.0 GA с полноценным пакетом для .NET. Теперь из кода на C# можно управлять той же средой выполнения агента с планированием, вызовом инструментов и многоходовыми сессиями, включая BYOK.

  • Как организовать эндпоинты minimal API с помощью MapGroup в ASP.NET Core 11

    Полное руководство по структурированию minimal API в ASP.NET Core 11 с помощью MapGroup: модули эндпоинтов на ресурс как методы расширения, вложенные группы, общие фильтры и аутентификация, префиксы с параметрами маршрута, теги OpenAPI и неожиданные правила порядка фильтров.

  • Как валидировать тело запроса в minimal API без контроллеров в ASP.NET Core 11

    В ASP.NET Core 11 есть встроенная валидация для minimal API: вызовите AddValidation, разметьте record запроса атрибутами DataAnnotations, и генератор исходного кода проверит связанную модель и вернёт 400 ProblemDetails ещё до запуска вашего обработчика. Без контроллеров, без FluentValidation, без ручных проверок.

  • Миграция с ValueTask<T> обратно на Task<T>: когда и почему (.NET 11, C# 14)

    Практический чеклист для возврата типов возвращаемого значения ValueTask и ValueTask<T> к Task и Task<T>: что ломается в точках вызова, как проверить каждое изменение и как понять, стоила ли замена усилий.

  • Миграция приложения Blazor Server на Blazor United (Blazor Web App) в .NET 11

    Пошаговый чек-лист для перевода отдельного приложения Blazor Server на унифицированный шаблон Blazor Web App в .NET 11 с сохранением каждой страницы в режиме InteractiveServer без изменения поведения.

  • Миграция Azure Functions с модели in-process на изолированный worker (.NET 8 / .NET 11)

    Пошаговый чек-лист для перевода .NET-приложения Azure Functions с модели in-process на изолированный worker до прекращения поддержки 10 ноября 2026 года, с диффами csproj, переписыванием сигнатур и развёртыванием через обмен слотами.

  • EF Core ExecuteUpdate против загрузки сущностей и SaveChanges: что выбрать?

    Руководство по выбору и реальный benchmark для EF Core 11: используйте ExecuteUpdate для множественных записей по предикату, а путь загрузить-затем-SaveChanges только тогда, когда нужен отслеживатель изменений, перехватчики или сложный граф объектов.

  • .NET 11 умеет преобразовывать double в hex и обратно бит в бит

    .NET 11 Preview 4 учит double, float и Half форматироваться спецификатором X и разбираться через NumberStyles.HexFloat, выдавая тот же hex-текст IEEE-754, что и printf("%a") в C.

  • Исправление: ObjectDisposedException: Cannot access a disposed context instance

    Ваша задача fire-and-forget захватила DbContext с областью запроса, который область DI уже освободила. Создайте новый контекст внутри задачи через IServiceScopeFactory или IDbContextFactory.

  • EF Core 11 Preview 4: Хватит заново вводить --project и --startup-project с .config/dotnet-ef.json

    EF Core 11 Preview 4 позволяет инструменту dotnet ef читать значения опций по умолчанию из файла .config/dotnet-ef.json, так что многопроектные решения больше не вынуждают передавать --project и --startup-project в каждой команде.

  • Как использовать разделение запросов, чтобы избежать декартова взрыва в EF Core 11

    Когда вы делаете Include двух одноуровневых коллекций, EF Core 11 возвращает декартово произведение, и число строк взрывается. Вот как это исправляет AsSplitQuery, как включить его глобально и какие тонкости согласованности и упорядочивания нужно учитывать.

2026 / 05

2026 / 04

2026 / 02

2026 / 01

2025 / 04

2025 / 01

2024 / 12

  • Что нового в C# 14.0

    Обзор всех новых возможностей C# 14.0, включая ключевое слово field, члены расширения, null-условное присваивание, неявные преобразования span и многое другое.

  • История версий языка C#

    Эволюция C# превратила его в современный высокопроизводительный язык. Это руководство отслеживает каждую важную веху. Ранние годы (C# 1.0 - 1.2). C# был выпущен в 2002 году как основной язык для .NET Framework. Он напоминал Java, но с фокусом на разработке под Windows. Версия 1.2 появилась вскоре после с небольшими...

2023 / 11

2023 / 10

  • C# Как помечать функциональность как экспериментальную

    Начиная с C# 12, новый ExperimentalAttribute позволяет помечать типы, методы, свойства или сборки как экспериментальные. Узнайте, как использовать его с diagnosticId, pragma-тегами и UrlFormat.

  • C# параметры ref readonly

    Модификатор ref readonly в C# даёт более прозрачный способ передавать ссылки только для чтения. Узнайте, как он улучшает модификатор in за счёт более чётких ограничений и видимости для вызывающей стороны.

  • C# как перемешать массив?

    Самый простой способ перемешать массив в C# — использовать Random.Shuffle, появившийся в .NET 8. Метод работает in-place как с массивами, так и со спанами.

  • C# Что такое NullReferenceException и как её исправить?

    Узнайте, что вызывает NullReferenceException в C#, как её отлаживать и как предотвращать с помощью проверок на null, оператора null-conditional и ссылочных типов, допускающих null.

  • Добавление/удаление TypeInfoResolver у существующих JsonSerializerOptions

    Узнайте, как добавлять или удалять экземпляры TypeInfoResolver у существующих JsonSerializerOptions с помощью нового свойства TypeInfoResolverChain в .NET 8.

  • C# 12 Interceptors

    Знакомимся с interceptors из C# 12 — экспериментальной возможностью компилятора в .NET 8, позволяющей подменять вызовы методов на этапе компиляции с помощью атрибута InterceptsLocation.

2023 / 09

2023 / 08

  • C# 12 Inline arrays

    Inline arrays позволяют создать массив фиксированного размера внутри struct. Такая структура с inline-буфером по производительности сравнима с unsafe fixed size buffer. Inline arrays в первую очередь рассчитаны на команду runtime и некоторых авторов библиотек для улучшения производительности в определённых сценариях. Скорее всего...

  • C# 12 collection expressions

    C# 12 вводит новый упрощённый синтаксис создания массивов. Выглядит он так: Важно: тип массива должен быть указан явно, поэтому использовать var для объявления переменной нельзя. Аналогично, чтобы создать Span<int>, можно сделать так: Многомерные массивы Преимущества этого лаконичного синтаксиса...

  • C# Как дождаться завершения процесса?

    Дождаться завершения процесса можно с помощью метода WaitForExit. Ваш код синхронно подождёт, пока процесс завершится, и затем продолжит выполнение. Рассмотрим пример: Этот код запустит новый процесс cmd.exe и выполнит команду timeout 5. Вызов process.WaitForExit() заставит вашу программу...

  • C# 12 alias для любых типов

    Директива using alias в C# 12 стала более гибкой и теперь позволяет создавать алиасы для любых типов, а не только для именованных. Это значит, что вы можете создавать алиасы для tuples, указателей, массивов, обобщённых типов и т. д. Вместо полной структурной формы tuple теперь можно дать короткий описательный алиас...

  • Есть ли в C# аналог инструкции With...End With?

    Инструкция With...End With в VB позволяет выполнять серию операторов, которые многократно обращаются к одному объекту, используя упрощённый синтаксис доступа к его членам. Есть ли аналог в C#? Нет. Ближайший аналог - инициализаторы объектов, но они работают только при создании новых экземпляров.

2023 / 07

  • C# 12 - Первичные конструкторы

    Начиная с C# 12, можно объявлять первичный конструктор внутри классов и структур. Параметры размещаются в скобках сразу после имени типа. Они имеют широкую область видимости: могут инициализировать свойства или поля, использоваться как переменные в методах и локальных функциях, а также передаваться в базовый конструктор.

2023 / 06

  • Как начать программировать на C#

    Руководство для начинающих по началу программирования на C#: от установки Visual Studio до написания первой программы и поиска ресурсов для обучения.

  • Как перейти на C# 12

    Исправьте ошибки версии языка C# 12, обновив target framework до .NET 8 или указав LangVersion в файле .csproj.

  • Что нового в C# 12

    Обзор новых возможностей C# 12: первичные конструкторы, параметры лямбда по умолчанию, выражения коллекций, inline arrays и многое другое.

2023 / 05

2023 / 03

2020 / 11

2020 / 05

  • C# using var (using-объявление)

    Используйте using-объявления C# 8 (`using var`) для освобождения объектов IDisposable без вложенных фигурных скобок. Синтаксис, правила области видимости и когда лучше использовать блок `using`.

2020 / 04

2019 / 01

2013 / 10

2013 / 06

2013 / 05

2012 / 01

Все подборки Главная