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. Сначала самые новые.

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

2026 / 10

  • Как добавить полный открытый ключ сборки со строгим именем в InternalsVisibleTo в проекте SDK-стиля

    Подписанная сборка должна указывать дружественную сборку по полному открытому ключу из 320 символов, а не по токену, иначе сборка падает с CS1726 или CS0281. Получите ключ с помощью sn -p и sn -tp или кроссплатформенного скрипта на .NET, затем поместите его в метаданные Key элемента InternalsVisibleTo в .csproj. Также разобраны запасной вариант со свойством PublicKey, ключ DynamicProxyGenAssembly2 для Moq и ловушка с переносами строк.

  • Как отслеживать блокировку, разблокировку, вход и выход из сеанса Windows в приложении на C#

    Используйте SystemEvents.SessionSwitch в настольном или консольном приложении, переопределите OnSessionChange в службе Windows или перехватывайте WM_WTSSESSION_CHANGE самостоятельно. Код на .NET 10 для всех трёх вариантов, скрытый поток '.NET System Events', почему служба видит вход в систему, а настольное приложение нет, уведомления не по порядку и как узнать текущее состояние блокировки через WTSQuerySessionInformation.

  • NUnit 5: Assert.ThrowsAsync теперь возвращает Task, а без await тест проходит молча

    NUnit 5.0.0 делает Assert.ThrowsAsync, CatchAsync и DoesNotThrowAsync по-настоящему асинхронными. Если забыть await, проверка просто не выполнится. Что ломается, что ловит правило NUnit2059 из NUnit.Analyzers и какие ещё изменения NUnit 5 стоит проверить перед обновлением.

  • Как синхронно дождаться ValueTask в неасинхронном методе без выделения памяти

    Сначала проверьте IsCompleted и прочитайте результат через GetAwaiter().GetResult(): это стоит 0 байт. Блокируйтесь только если ValueTask ещё не завершён, и делайте это через кешированное событие и UnsafeOnCompleted вместо AsTask(), который выделяет от 72 до 208 байт на вызов. Измерено на .NET 10 и .NET 11 RC1.

  • Volatile.Read и Volatile.ReadBarrier в .NET 10

    Volatile.Read выполняет чтение одной ячейки с семантикой acquire. Volatile.ReadBarrier, новый в .NET 10, это барьер, который придаёт семантику acquire всем предшествующим чтениям. Используйте Volatile.Read для флагов и опубликованных ссылок, а ReadBarrier, когда нужно, чтобы пачка обычных или неатомарных чтений завершилась до следующего обращения к памяти, как в seqlock.

  • Исправление: CS8509 или CS0161 на switch, который исчерпывающий для типа union из C# 15

    Делайте switch по самому union, а не по .Value, и используйте switch-выражение или добавьте case null в оператор switch. Операторам нужно покрытие null, а выражения лишь выдают предупреждение.

2026 / 09

2026 / 08

2026 / 07

2026 / 06

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

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