Partilhar via


modificador necessário (Referência C#)

O modificador required indica que o campo ou a propriedade à qual é 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 a propriedades declaradas em struct, e a tipos class, incluindo tipos record e record struct. O modificador required não pode ser aplicado a membros de um interface.
  • 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 com null. Se o tipo for um tipo de referência não anulável, o compilador emitirá um aviso se você inicializar o membro para null. O compilador emite um erro se o membro não for inicializado de forma alguma.
  • Os membros requeridos devem ser pelo menos tão visíveis quanto o tipo que os contém. Por exemplo, uma classe public não pode conter um campo requiredprotected. Além disso, as propriedades necessárias devem ter setters (set ou init 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 membro required 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 o modificador required. O tipo derivado não pode remover o estado required. Os tipos derivados podem adicionar o modificador required ao substituir uma propriedade.
  • Um tipo com qualquer membro required não pode ser usado como um argumento de tipo quando o parâmetro type inclui a restrição new(). 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 inclua o modificador required.

Alguns tipos, como registos posicionais, utilizam um construtor primário para inicializar propriedades posicionais. Se qualquer uma dessas propriedades incluir o modificador required, o construtor primário adicionará o atributo SetsRequiredMembers. Isso indica que o construtor primário inicializa todos os membros necessários. Você pode escrever seu próprio construtor com o atributo System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. 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 atributo SetsRequiredMembers adiciona estas regras aos construtores:

  • Um construtor que se encadeia a outro construtor anotado com o atributo SetsRequiredMembers, this(), ou base(), também deve incluir o atributo SetsRequiredMembers. Isso garante que os chamadores possam usar corretamente todos os construtores apropriados.
  • Os construtores de cópia gerados para tipos record têm o atributo SetsRequiredMembers aplicado se algum dos membros for required.

Advertência

O SetsRequiredMembers desabilita as verificações do compilador de que todos os membros required são inicializados quando um objeto é criado. Use-o com cuidado.

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 membros necessários, consulte C#11 - Membros obrigatórios especificação da funcionalidade.