modificador necessário - Referência de C#
O modificador required
indica que o campo ou propriedade ao qual ele é aplicado deve ser inicializado por um inicializador de objeto. Qualquer expressão que inicialize uma nova instância do tipo deve inicializar todos os membros necessários. O modificador required
está disponível a partir do C# 11. O modificador required
permite que os desenvolvedores criem tipos em que as propriedades ou campos devem ser inicializados corretamente, mas ainda permitem a inicialização usando inicializadores de objeto. Várias regras garantem esse comportamento:
- O modificador
required
pode ser aplicado a campos e propriedades declarados em tiposstruct
eclass
, incluindo tiposrecord
erecord struct
. O modificadorrequired
não pode ser aplicado aos membros de uminterface
. - Implementações explícitas de interface não podem ser marcadas como
required
. Eles não podem ser definidos em inicializadores de objeto. - Os membros necessários devem ser inicializados, mas podem ser inicializados para
null
. Se o tipo for um tipo de referência não anulável, o compilador emitirá um aviso se você inicializar o membro paranull
. O compilador emitirá um erro se o membro não for inicializado. - Os membros necessários devem ser pelo menos tão visíveis quanto seu tipo de contenção. Por exemplo, uma classe
public
não pode conter um camporequired
que sejaprotected
. Além disso, as propriedades necessárias devem ter setters (acessadoresset
ouinit
) que sejam pelo menos tão visíveis quanto seus tipos de contenção. Os membros que não estão acessíveis não podem ser definidos pelo código que cria uma instância. - Classes derivadas não podem ocultar um membro declarado
required
na classe base. Ocultar um membro necessário impede que os chamadores usem inicializadores de objeto para ele. Além disso, os tipos derivados que substituem uma propriedade necessária devem incluir o modificadorrequired
. O tipo derivado não pode remover o estadorequired
. Tipos derivados podem adicionar o modificadorrequired
ao substituir uma propriedade. - Um tipo com membros
required
não pode ser usado como um argumento de tipo quando o parâmetro de tipo inclui a restriçãonew()
. O compilador não pode impor que todos os membros necessários sejam inicializados no código genérico. - O modificador
required
não é permitido na declaração para parâmetros posicionais em um registro. Você pode adicionar uma declaração explícita para uma propriedade posicional que inclui o modificadorrequired
.
Alguns tipos, como registros posicionais, usam um construtor primário para inicializar propriedades posicionais. Se qualquer uma dessas propriedades incluir o modificador required
, o constructo primário adicionará o atributo SetsRequiredMembers
. Isso indica que o constructo primário inicializa todos os membros necessários. Você pode escrever seu próprio constructo com o atributo System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. No entanto, o compilador não verifica se esses constructos inicializam todos os membros necessários. Em vez disso, o atributo afirma ao compilador que o constructo inicializa todos os membros necessários. O atributo SetsRequiredMembers
adiciona essas regras aos constructos:
- Um constructo que se encadeia a outro constructo anotado com o atributo
SetsRequiredMembers
, sejathis()
oubase()
, também deve incluir o atributoSetsRequiredMembers
. Isso garante que os chamadores possam usar corretamente todos os constructos apropriados. - Constructos de cópia gerados para tipos
record
têm o atributoSetsRequiredMembers
aplicado se qualquer um dos membros forrequired
.
Aviso
O SetsRequiredMembers
desabilita as verificações do compilador de que todos os membros required
são inicializados quando um objeto é criado. Use-a com atenção.
O código a seguir mostra uma hierarquia de classe que usa o modificador required
para as propriedades FirstName
e 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; }
}
Para obter mais informações sobre os membros necessários, consulte a especificação do recurso C#11 – Membros necessários.