Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
requiredmodificatore ai campi e alle proprietà dichiarate instructeclass, inclusirecordi tipi erecord struct. Non è possibile applicare ilrequiredmodificatore ai membri di un oggettointerface. - 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 anull. 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
publicnon può contenere un camporequiredprotected. Inoltre, le proprietà obbligatorie devono avere setter (accessorsetoinit) 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
requireddichiarato 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 modificatorerequired. Il tipo derivato non può rimuovere lo statorequired. I tipi derivati possono aggiungere il modificatorerequiredquando si esegue l'override di una proprietà. - Non è possibile usare un tipo con membri
requiredcome argomento di tipo quando il parametro di tipo include ilnew()vincolo. Il compilatore non può imporre che tutti i membri necessari vengano inizializzati nel codice generico. - Non è possibile usare il
requiredmodificatore nella dichiarazione per i parametri posizionali in un record. È possibile aggiungere una dichiarazione esplicita per una proprietà posizionale che include il modificatorerequired.
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()obase(), deve includere anche l'attributoSetsRequiredMembers. Ciò garantisce che i chiamanti possano usare correttamente tutti i costruttori appropriati. - I costruttori di copia generati per i tipi
recordhanno l'attributoSetsRequiredMembersapplicato 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à.