Как вы, вероятно, знаете, компания Microsoft начала объявлять о выходе новой версии своего языка программирования: C# 11.
Среди многих других вещей, они раскрыли множество новых возможностей, которые принесет эта версия, и так как я уже прокомментировал лучшие возможности в других постах, сегодня мы рассмотрим те возможности, которые вы могли пропустить, потому что о них мало говорили или потому что они не вызвали столько шумихи.
Давайте посмотрим, что нового в C# 11!
Поддержка общей математики
Generic Math — это функция, которую Microsoft представила в .NET 6, но теперь, с приходом .NET 7, они реализовали множество улучшений, и именно поэтому мы поговорим о ней. С помощью Generic Math вы можете использовать все преимущества операторов и статических API, сочетая статические виртуализации и мощь дженериков.
Одно из его основных преимуществ заключается в том, что он позволяет ограничить входные данные числоподобными типами, избегая множества похожих реализаций (если не почти идентичных). Кроме того, теперь вы сможете использовать различные операторы из родовых контекстов.
В дополнение к этой новой возможности, поддержка общей математики была дополнена различными функциями, такими как:
- статические и виртуальные члены в интерфейсах
- Проверенные определяемые пользователем операторы
- Ослабленные требования к правому сдвигу
- Оператор с беззнаковым правым сдвигом
Благодаря этому теперь можно будет добавлять статические абстрактные члены с перегружаемыми операторами (или статические свойства или члены) для определения интерфейсов.
И это еще не все, теперь также были созданы некоторые другие требования, связанные с общей математикой. Эти требования делятся на 3:
- Беззнаковый оператор сдвига вправо: Теперь в C# 11 вам придется просто использовать
>>>
для принудительного выполнения любого беззнакового сдвига вправо. - Ослабленные требования к оператору сдвига: Благодаря C# 11 требование, что второй операнд должен быть int, устранено, и благодаря этому в таких случаях можно использовать типы, реализующие общие математические интерфейсы.
- Проверенные и непроверенные операторы, определяемые пользователем: Теперь можно определять как проверенные, так и непроверенные арифметические операторы. Это позволяет компилятору, всегда в зависимости от контекста, генерировать вызовы к правильной переменной.
Если вы хотите узнать больше об этой возможности, я рекомендую вам, как всегда, обратиться к первоисточнику: Microsoft C# 11 Generic math support
Числовые IntPtr
и UIntPtr
Эта новая возможность добавляет к интегральным числовым типам nint
и nuint
псевдонимы System.IntPtrиSystem.UlntPtr.
Два типа nint и nuint являются целыми числами собственного размера. Дело в том, что они являются родными, если, например, являются 64-битными целыми числами и выполняются в 64-битном процессе. Аналогично и для 32-битного сценария.
Еще одним преимуществом является оптимизация производительности в сценариях, где используется целочисленная математика, а также их можно использовать в низкоуровневых библиотеках и сценариях interop.
В следующей таблице вы можете найти все числовые типы Integral:
Если вы хотите узнать больше об этой функции, я рекомендую вам, как всегда, обратиться к первоисточнику: Microsoft Numeric IntPtr и UIntPtr
Структура с автоматическим определением по умолчанию
Эта функция C# 11 немного больше ориентирована на компилятор. Для тех, кто не знает, переменная типа struct
содержит все данные этой структуры. Таким образом, вы можете легко отличить, инициализирована ли структура, неинициализирована или имеет значение по умолчанию. Рассмотрим пример Microsoft:
Инстанцирование массива типа структуры создает массив со значениями по умолчанию типа структуры, игнорируя при этом коструктор без параметров.
Теперь в C# 11 новый компилятор этой версии заботится о том, чтобы поля любого типа struct
всегда инициализировались значением по умолчанию. В результате этого, если автоматическое свойство или поле не инициализировано конструктором, оно будет инициализировано компилятором.
Если вы хотите узнать больше об этой особенности, я рекомендую вам, как всегда, обратиться к первоисточнику: Microsoft auto-default struct
Шаблонное соответствие Span<char>
или ReadOnlySpan<char>
на константе string
Как сообщает нам Microsoft, уже несколько версий назад в C# с помощью сопоставления шаблонов можно было проверить, имеет ли конкретная строка определенное константное значение. Теперь в C# 11 появилась возможность использовать ту же логику для проверки переменных ReadOnlySpan и Span.
Если вы хотите узнать больше об этой возможности, я рекомендую вам, как всегда, обратиться к первоисточнику: Microsoft pattern matching
Расширенная область видимости nameof
Функция выражений nameof
заключается в генерации имени типа, переменной или члена в виде строковой константы. Кроме того, оно никак не влияет на время выполнения, поскольку оценивается и выполняется во время компиляции.
Одна из полезностей выражения nameof
заключается в поддержании кода проверки аргументов. Рассмотрим следующий пример Microsoft:
В новой версии C# можно будет указать имя любого параметра метода в атрибуте объявления метода с помощью операторов nameof
.
Это связано с тем, что когда в выражении nameof
используются как имена параметров, так и имена параметров типа, они всегда находятся в области видимости.
Это позволяет легко добавлять атрибуты для анализа nullable.
Если вы хотите узнать больше об этой возможности, я рекомендую вам, как всегда, обратиться к первоисточнику: Microsoft расширила область видимости nameof
Все эти новые возможности в C# 11 и вся работа, которую Microsoft проводит для C#, просто поразительны. Это не незначительный релиз, это очень большой релиз, и, по крайней мере, для меня, мы находимся перед одним из самых больших обновлений языка C#.
Если мы вспомним принципы C# до сегодняшнего дня, что мы можем разрабатывать от настольных приложений, через веб-приложения к мобильным. И давайте не будем забывать, что C# также является популярным языком программирования для разработки игр (Unity).
Конечно, до официального релиза C# 11 еще несколько месяцев, и, зная Microsoft, мы уверены, что до этого времени ей есть чем нас удивить. Что вы думаете в целом о C# 11? Получилось ли то, что вы ожидали? Не хватает ли вам какой-нибудь функции или чего-то лучшего?