Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Модификатор required указывает, что поле или свойство , которое оно применяется, должно быть инициализировано инициализатором объектов. Любое выражение, инициализирующее новый экземпляр типа, должно инициализировать все необходимые элементы . Модификатор required доступен начиная с C# 11.
Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.
Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.
Подсказка
Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.
С помощью required модификатора разработчики могут создавать типы, в которых свойства или поля должны быть правильно инициализированы, но по-прежнему разрешать инициализацию с помощью инициализаторов объектов. Некоторые правила обеспечивают такое поведение:
- Примените модификатор к полям и свойствам
required, объявленным вstructиclassтипах, включаяrecordиrecord structтипы. Не удается применитьrequiredмодификатор к членам объектаinterface. - Не удается пометить явные
requiredреализации интерфейса как . Их нельзя задать в инициализаторах объектов. - Необходимо инициализировать необходимые элементы, но их можно инициализировать
null. Если тип является ссылочным типом, не допускающим значение NULL, компилятор выдает предупреждение при инициализации элемента вnull. Компилятор выдает ошибку, если член не инициализирован вообще. - Требуемые члены должны быть как минимум столь же видимы, как их содержащий тип. Например, класс
publicне может содержать полеrequiredс характеристикойprotected. Кроме того, обязательные свойства должны иметь методы задания (setилиinitметоды доступа), которые по крайней мере, столь же видимы, как их содержащие типы. Код, создающий экземпляр, не может задавать элементы, которые недоступны. - Производные классы не могут скрыть элемент
required, объявленный в базовом классе. Скрытие необходимого элемента запрещает вызывающим объектам использовать инициализаторы объектов для него. Кроме того, производные типы, которые переопределяют необходимое свойство, должны включать модификаторrequired. Производный тип не может удалить состояниеrequired. Производные типы могут добавлять модификаторrequiredпри переопределении свойства. - Тип с элементами
requiredнельзя использовать в качестве аргумента типа, если параметр типа включаетnew()ограничение. Компилятор не может гарантировать, что все обязательные элементы инициализированы в генерик-коде. - Модификатор нельзя использовать
requiredв объявлении для позиционных параметров записи. Можно добавить явное объявление для позиционного свойства, которое включает в себя модификаторrequired.
Некоторые типы, такие как позиционные записи , используют первичный конструктор для инициализации соответствующих свойств. Если любое из этих свойств включает модификатор required, основной конструктор добавляет атрибут SetsRequiredMembers. Этот атрибут указывает, что основной конструктор инициализирует все необходимые элементы. Вы можете написать собственный конструктор с помощью атрибута System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. Однако компилятор не проверяет, что эти конструкторы инициализируют все требуемые члены. Скорее, атрибут утверждает компилятору, что конструктор инициализирует все необходимые элементы. Атрибут SetsRequiredMembers добавляет эти правила в конструкторы:
- Конструктор, который объединяется с другим конструктором, аннотированный атрибутом
SetsRequiredMembersлибоthis(), либоbase(), также должен включать атрибутSetsRequiredMembers. Это гарантирует правильность использования всех соответствующих конструкторов вызывающими лицами. - Конструкторы копирования, созданные для типов
record, имеют атрибутSetsRequiredMembers, если любой из членов являетсяrequired.
Предупреждение
Атрибут SetsRequiredMembers отключает проверки компилятора, что все required члены инициализированы при создании объекта. Используйте его с осторожностью.
В следующем коде показана иерархия классов, использующая модификатор required для свойств FirstName и LastName:
public class Person
{
public Person() { }
[SetsRequiredMembers]
public Person(string firstName, string lastName) =>
(FirstName, LastName) = (firstName, lastName);
public required string FirstName { get; init; }
public required string LastName { get; init; }
public int? Age { get; set; }
}
public class Student : Person
{
public Student() : base()
{
}
[SetsRequiredMembers]
public Student(string firstName, string lastName) :
base(firstName, lastName)
{
}
public double GPA { get; set; }
}
Дополнительные сведения о необходимых членах см. в разделе C#11 — обязательные элементы спецификации компонентов.