Condividi tramite


Modificatore obbligatorio (Riferimento a C#)

Il required modificatore indica che il campo o la proprietà a cui si applica deve essere inizializzato da un inizializzatore di oggetto. Qualsiasi espressione che inizializza una nuova istanza del tipo deve inizializzare tutti i membri necessari . Il required modificatore è disponibile a partire da C# 11.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

Usando il required modificatore, gli sviluppatori possono creare tipi in cui le proprietà o i campi devono essere inizializzati correttamente, ma consentono comunque l'inizializzazione tramite inizializzatori di oggetti. Alcune regole assicurano questo comportamento:

  • Applicare il required modificatore ai campi e alle proprietà dichiarate in struct e class , inclusi record i tipi e record struct . Non è possibile applicare il required modificatore ai membri di un oggetto interface.
  • Non è possibile contrassegnare le implementazioni esplicite dell'interfaccia come required. Non è possibile impostarli negli inizializzatori di oggetto.
  • È necessario inizializzare i membri necessari, ma è possibile inizializzarli in null. Se il tipo è un tipo riferimento non nullabile, il compilatore genera un avviso se si inizializza il membro a null. Il compilatore genera un errore se il membro non viene inizializzato affatto.
  • I membri obbligatori devono essere almeno tanto visibili quanto il loro tipo contenitore. Ad esempio, una classe public non può contenere un campo requiredprotected. Inoltre, le proprietà obbligatorie devono avere setter (accessorset o init) che sono almeno altrettanto visibili quanto i tipi che li contengono. Il codice che crea un'istanza non può impostare membri che non sono accessibili.
  • Le classi derivate non possono nascondere un membro required dichiarato nella classe base. Nascondere un membro richiesto impedisce ai chiamanti di usare gli inizializzatori di oggetto per esso. Inoltre, i tipi derivati che eseguono l'override di una proprietà obbligatoria devono includere il modificatore required. Il tipo derivato non può rimuovere lo stato required. I tipi derivati possono aggiungere il modificatore required quando si esegue l'override di una proprietà.
  • Non è possibile usare un tipo con membri required come argomento di tipo quando il parametro di tipo include il new() vincolo. Il compilatore non può imporre che tutti i membri necessari vengano inizializzati nel codice generico.
  • Non è possibile usare il required modificatore nella dichiarazione per i parametri posizionali in un record. È possibile aggiungere una dichiarazione esplicita per una proprietà posizionale che include il modificatore required.

Alcuni tipi, come i record posizionali , usano un costruttore primario per inizializzare le proprietà posizionali. Se una di queste proprietà include il modificatore required, il costruttore primario aggiunge l'attributo SetsRequiredMembers. Questo attributo indica che il costruttore primario inizializza tutti i membri necessari. È possibile scrivere il proprio costruttore con l'attributo System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. Tuttavia, il compilatore non verifica che questi costruttori inizializzino tutti i membri necessari. Invece, l'attributo asserisce al compilatore che il costruttore inizializza tutti i membri necessari. L'attributo SetsRequiredMembers aggiunge queste regole ai costruttori:

  • Un costruttore concatenato a un altro costruttore annotato con l'attributo SetsRequiredMembers, this()o base(), deve includere anche l'attributo SetsRequiredMembers. Ciò garantisce che i chiamanti possano usare correttamente tutti i costruttori appropriati.
  • I costruttori di copia generati per i tipi record hanno l'attributo SetsRequiredMembers applicato se uno dei membri è required.

Avvertimento

L'attributo SetsRequiredMembers disabilita i controlli del compilatore che tutti i required membri vengono inizializzati quando viene creato un oggetto. Usarlo con cautela.

Il codice seguente mostra una gerarchia di classi che usa il modificatore required per le proprietà 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; }
}

Per altre informazioni sui membri necessari, vedere C#11 - Membri obbligatori specifica della funzionalità.