Изменения в Структурах в C# 10
C# 10 представляет функции для структур, которые обеспечивают лучшее соответствие структур и классов.
Конструкторы без параметров и инициализаторы полей
До C# 10 каждая структура имела неявный общедоступный конструктор без параметров, который устанавливал для полей структуры значения по умолчанию. Создание конструктора без параметров для структуры было ошибкой.
Теперь вы можете добавлять конструкторы структур без параметров. Они должны быть публичными и не могут быть частичными. Если вы его не добавите, будет предоставлен неявный конструктор без параметров, устанавливающий для всех полей значения по умолчанию.
public struct Address {
public Address() {
City = "<unknown>";
}
public string City { get; init; }
}
Можно инициализировать поля в конструкторе без параметров, как выше, либо через инициализаторы полей или свойств:public struct Address {
public string City { get; init; } = "<unknown>";
}
Структуры, созданные через ключевое слово default или при определении массива, игнорируют явные конструкторы без параметров и всегда устанавливают для членов значения по умолчанию.Структуры-записи
Начиная с C# 10, записи можно определять как структуры:
public record struct PersonВы можете продолжить определять записи как классы либо просто по слову
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
record, либо через record class для ясности.Структуры и так сравниваются по значению. Структуры-записи добавляют поддержку
IEquatable<T> и оператор ==, а также включают переопределение ToString().Также поддерживается позиционная запись:
public record struct Person (string FirstName, string LastName);Параметры первичного конструктора становятся публичными свойствами структуры-записи. В отличие от классов-записей, неявно созданные свойства доступны для чтения и записи.
Это упрощает преобразование кортежей в именованные типы. Изменение типов возвращаемых значений с кортежа, вроде
(string FirstName, string LastName), на именованный тип Person, может очистить ваш код и гарантировать согласованные имена членов.Чтобы создать неизменяемую структуру записи, добавьте
readonly в определение структуры или отдельных свойств. Инициализаторы объектов являются частью этапа построения, на котором можно установить свойства только для чтения, поэтому следующая инициализация сработает и для readonly-структур:var person = new Person { FirstName = "Mads", LastName = "Torgersen"};
Модификатор sealed для ToString() в классах-записяхТеперь метод
ToString() может включать модификатор sealed, который не позволит его переопределять в производных типах записей.Выражение with в структурах и анонимных типах
C# 10 поддерживает выражение with для всех структур, включая структуры-записи, а также для анонимных типов:
var person2 = person with {LastName = "Kristensen"};
Выражение возвращает новый экземпляр с новым значением. Вы можете обновить любое количество полей. Поля, которые вы не установили, сохранят то же значение, что и исходный экземпляр.Источник: https://devblogs.microsoft.com/dotnet/welcome-to-csharp-10/