modificador necessário (Referência C#)
O required
modificador 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 required
modificador está disponível a partir do C# 11. O required
modificador 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
required
modificador pode ser aplicado a campos e propriedades declarados emstruct
, eclass
tipos, incluindorecord
erecord struct
tipos. Orequired
modificador não pode ser aplicado a membros de uminterface
arquivo . - Implementações de interface explícitas 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 em
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 emite um erro se o membro não for inicializado. - Os membros requeridos devem ser pelo menos tão visíveis quanto o tipo que os contém. Por exemplo, uma
public
classe não pode conter umrequired
campo que sejaprotected
. Além disso, as propriedades necessárias devem ter setters (set
init
ou acessadores) 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. - As classes derivadas não podem ocultar um
required
membro declarado 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 orequired
modificador. O tipo derivado não pode remover orequired
estado. Os tipos derivados podem adicionar orequired
modificador ao substituir uma propriedade. - Um tipo com quaisquer
required
membros não pode ser usado como um argumento de tipo quando o parâmetro type inclui anew()
restrição. O compilador não pode impor que todos os membros necessários sejam inicializados no código genérico. - O
required
modificador 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 inclua orequired
modificador.
Alguns tipos, como registros posicionais, usam um construtor primário para inicializar propriedades posicionais. Se qualquer uma dessas propriedades incluir o required
modificador, o construtor primário adicionará o SetsRequiredMembers
atributo. Isso indica que o construtor primário inicializa todos os membros necessários. Você pode escrever seu próprio construtor com o System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute atributo. No entanto, o compilador não verifica se esses construtores inicializam todos os membros necessários. Em vez disso, o atributo afirma ao compilador que o construtor inicializa todos os membros necessários. O SetsRequiredMembers
atributo adiciona estas regras aos construtores:
- Um construtor que encadeia a outro construtor anotado com o
SetsRequiredMembers
atributo, outhis()
,base()
também deve incluir oSetsRequiredMembers
atributo. Isso garante que os chamadores possam usar corretamente todos os construtores apropriados. - Os construtores de cópia gerados para
record
tipos têm oSetsRequiredMembers
atributo aplicado se qualquer um dos membros forrequired
.
Aviso
O SetsRequiredMembers
desabilita as verificações do compilador de que todos os required
membros são inicializados quando um objeto é criado. Use-o com cuidado.
O código a seguir mostra uma hierarquia de classe que usa o required
modificador para as FirstName
propriedades 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 membros necessários, consulte a especificação do recurso C#11 - Membros obrigatórios .