Обзор нововведений в C# 15

zinduro 59 минут назад Краткое содержание статьи Обзор нововведений в C# 15 Средний 8 мин 1.9K Блог компании PVS-Studio .NET * C# * Программирование * Совсем скоро нам станет полноценно доступна новая версия C#, и мы...
Will Anthropic have the best AI model at the end of October 2026?
В сфере искусственного интеллекта произошло заметное событие. zinduro 59 минут назад Краткое содержание статьи Обзор нововведений в C# 15 Средний 8 мин 1. 9K Блог компании PVS-Studio . NET * C# * Программирование * Совсем скоро нам станет полноценно доступна новая версия C#, и мы продолжаем наш ежегодный цикл обзора нововведений.
В этот раз команда Microsoft приготовила нам ряд очень интересных и ожидаемых изменений. Предлагаю рассмотреть их подробно. Union-типыДля начала рассмотрим наиболее понятное нововведение — union-типы.
Технические детали
Данная фича позволит разработчикам объединять типы, не прибегая к наследованию и интерфейсам, где это не нужно или невозможно. Union — это структура, которая содержит в себе полный набор поддерживаемых типов. public union TestUnion(int, Version, IEnumerable); В коде выше union — ключевое слово, а int, Version, IEnumerable — набор поддерживаемых типов.
Примером использования новой структуры может служить ситуация, где традиционное наследование не всегда может подойти, так как оно обязывает объекты иметь что-то общее. Но могут быть случаи, когда наследование невозможно или бессмысленно с точки зрения архитектуры. Допустим, нам нужно обработать определённый ряд типов, включая примитивы.
В обычном случае нам пришлось бы указать на входе переменную типа object, которую внутри необходимо было кастить к нужным типам, включая описание логики для неподходящих вариантов. Это звучит ненадёжно. Использование union в данном случае исправило бы эти проблемы, делая код надёжнее и читабельнее.
Отраслевые последствия
Исходя из сущности новой структуры, при использовании union компилятору изначально известен полный список всех типов, которые находятся внутри него. Это убирает необходимость в ветке default, что защищает программиста от ситуации, когда в switch были обработаны не все типы, а новые наследники постоянно попадают в default-секцию, что может вызывать непредсказуемое поведение программы. Предлагаю рассмотреть более конкретно.
Например, раньше, чтобы описать метод для обработки ответов от API, нужно было делать что-то подобное:public abstract record ApiResult; public record ErrorData(string Message); public record Success(string Data) : ApiResult; public record ValidationError(ErrorData Data) : ApiResult; public string Process(ApiResult result) { return result ; } Объявляется абстрактный класс ApiResult, от которого наследуются конкретные ответы. Потому, если появится новый наследник, а разработчик не предусмотрит его обработку, то выполнение кода приведёт в ветку default. Union помогает реализовать это иначе:public record ErrorData(string Message); public record Success(string Data); public record ValidationError(ErrorData Data); public union ApiResult(Success, ValidationError) { public string GetData() { return this ; } } Как видно, здесь не нужно создавать родительский класс, чтобы объединить их.
Также мы получаем более стабильное поведение за счёт того, что ещё во время компиляции известно, какие именно типы может содержать данный union.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






