В данной статье мы рассмотрим новую версию языка C# 10, которая включает в себя небольшой список изменений относительно C# 9. Ниже приведены их описания вместе с поясняющими фрагментами кода. Давайте их рассмотрим. Теперь в структурах можно задать инициализацию полей и свойств: В C# 10 станет доступно создание конструктора без параметров для структур: Важно. Использовать конструктор без параметров можно только тогда, когда все поля и/или свойства имеют инициализаторы. Например, если не задать инициализатор Age, возникнет ошибка: Error CS0843: Auto-implemented property 'User.Age' must be fully assigned before control is returned to the caller. Новая версия C# делает доступным использование выражения with со структурами, как ранее это можно было сделать с записями. Пример: Очевидно, что изменяемое свойство (в данном случае поле Name) должно быть с публичным модификатором доступа. Данное нововведение позволит использовать директиву using с охватом всего проекта. Для этого необходимо перед фразой using добавить ключевое слово global: Таким образом, можно не дублировать в разных файлах одни и те же пространства имён, используя директиву using. Важно. Применять данную конструкцию следует ПЕРЕД включениями using, которые объявлены без использования global. Пример: В ином случае: Если произошло так, что вы повторно включили одно пространство имён при условии, что оно было ранее включено с использованием ключевого слова global, то об этом будет сообщено средой разработки (IDE: 0005: Using directive is unnecessary). Бывает такое, что пространство имён необходимо использовать во всём файле, но это может немного сдвинуть отступы текста программы. Теперь для решения этой проблемы добавлена возможность использования namespace для всего файла. Для этого необходимо написать namespace без использования блочных фигурных скобок: Ранее необходимо было тянуть на весь файл открытый блок namespace: Очевидно, указать в файле можно лишь один такого рода namespace. То есть данная запись некорректна: как и запись такого вида: В версии языка C# 10.0 было добавлено необязательное ключевое слово class у записей, которое лишь помогает при чтении кода определить принадлежность записи к ссылочному типу. То есть две следующие записи идентичны: Также теперь можно создавать структуры записей: По умолчанию, свойства данной записи можно изменять, в отличие от стандартной record, в которой модификатор изменения полей – init: К данной структуре можно применить свойство readonly, тогда доступ к полям будет подобен обычной записи: где свойства записаны как: Равенство двух объектов структуры записей схоже с равенством двух обычных структур – равенство истинно, если эти два объекта хранят одни и те же данные: Стоит отметить, что для структур записей не генерируется конструктор копирования. Если определить его и использовать ключевое слово with при инициализации нового объекта, то вызываться будет оператор присваивания, вместо конструктора копирования (как это происходит при работе с record class). Как писал мой коллега в статье о нововведениях в C# 9, у записей имеется метод ToString, который можно переопределить. Но при наследовании есть одна особенность: переопределенный вами метод ToString не будет унаследован потомками от родительской записи. Для того чтобы потомки записей наследовали метод ToString, стало доступно использование ключевого слова sealed, которое запрещает компилятору генерировать имплементацию метода ToString у дочерних записей. Данное ключевое слово указывается при переопределении метода ToString: Создадим следующую запись, включая переопределение метода ToString: И наследуем от него вторую запись: Теперь создадим по экземпляру каждой из записей и напечатаем результат в консоль: Как видно из результата выше, метод ToString не был наследован записью InheritedRecord. Немного изменим запись TestRec, добавив ключевое слово sealed: Заново создадим два экземпляра записей и напечатаем результат в консоль: И.. ура! Метод ToString был наследован в записи InheritedRecord. Версия языка C# 8.0 предоставила возможность использования шаблонных свойств, с помощью которых можно удобно сопоставлять поля и/или свойства какого-либо объекта с необходимыми значениями. Ранее, если необходимо было проверить какое-либо вложенное свойство, то приходилось громоздить конструкцию: Сейчас достаточно лишь привычного добавления точек между свойствами: Рассмотрим изменение на примере метода взятия 4 первых символов имени. Как видно из примера выше, новый тип обращения к свойствам проще и понятнее, чем был раньше. Ранее данная возможность не поддерживалась, но в новой версии языка C# можно будет интерполировать и константные строки: Интересный факт. Данное нововведение относится к интерполированию строк, то есть добавление константного символа не допускается: В старом варианте вызова деконструктора можно использовать ИЛИ объявленные переменные (все объявлены), ИЛИ переменные, которые мы инициализируем прямо при вызове (все НЕ объявлены): Новая версия языка допускает одновременное использование как объявленных ранее, так и не объявленных переменных при деконструировании: В версии C# 9 возникала ошибка: Error CS8184: A deconstruction cannot mix declarations and expressions on the left-hand-side. Как говорилось ранее, список изменений не столь велик, как в версии C# 9. Одни изменения упрощают работу, а другие разблокируют ранее недоступные возможности. Развитие не стоит на месте, а мы будем ждать новых обновлений языка C#. Если вы еще не ознакомлены с нововведениями версии C# 9, то о них мы тоже подробно рассказывали в отдельной статье. Если вы хотите ознакомиться с первоисточником, можете прочесть документацию Microsoft. Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Valentin Prokofiev. What's new in C# 10: overview. Программист C#