обязательный модификатор (справочник по C#)
Модификатор required
указывает, что поле или свойство, которое оно применяется, должно быть инициализировано инициализатором объекта. Любое выражение, инициализирующее новый экземпляр типа, должно инициализировать все необходимые элементы. Модификатор required
доступен начиная с C# 11. Модификатор 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.