vereiste modifier (C#-verwijzing)
De required
modifier geeft aan dat het veld of eigenschap waarop deze wordt toegepast, moet worden geïnitialiseerd door een object initializer. Elke expressie die een nieuw exemplaar van het type initialiseert, moet alle vereiste ledeninitialiseren. De required
modifier is beschikbaar vanaf C# 11. Met de required
modifier kunnen ontwikkelaars typen maken waarbij eigenschappen of velden correct moeten worden geïnitialiseerd, maar nog steeds initialisatie toestaan met behulp van objectinitialisaties. Verschillende regels zorgen voor dit gedrag:
- De
required
modifier kan worden toegepast op velden en eigenschappen gedeclareerd instruct
, en opclass
typen, inclusiefrecord
enrecord struct
typen. Derequired
wijzigingsfunctie kan niet worden toegepast op leden van eeninterface
. - Expliciete interface-implementaties kunnen niet worden gemarkeerd als
required
. Ze kunnen niet worden ingesteld in object initializers. - Vereiste leden moeten worden geïnitialiseerd, maar ze kunnen worden geïnitialiseerd op
null
. Als het type een niet-nullable verwijzingstype is, geeft de compiler een waarschuwing af als u het member initialiseert naarnull
. De compiler geeft een fout op als het lid helemaal niet is geïnitialiseerd. - Vereiste leden moeten minstens even zichtbaar zijn als het type dat hen bevat. Een
public
-klasse kan bijvoorbeeld geenrequired
veld bevatten datprotected
is. Bovendien moeten vereiste eigenschappen setters (set
- ofinit
-accessors) hebben die minstens zo zichtbaar zijn als de typen waarin ze zich bevinden. Leden die niet toegankelijk zijn, kunnen niet worden ingesteld door code waarmee een exemplaar wordt gemaakt. - Afgeleide klassen kunnen een
required
lid dat in de basisklasse is gedeclareerd, niet verbergen. Als u een vereist lid verbergt, voorkomt u dat aanroepers objectinitializers gebruiken. Bovendien moeten afgeleide typen die een vereiste eigenschap overschrijven derequired
modifier bevatten. Het afgeleide type kan de statusrequired
niet verwijderen. Afgeleide typen kunnen derequired
modifier toevoegen bij het overschrijven van een eigenschap. - Een type met
required
leden kan niet worden gebruikt als een typeargument wanneer de typeparameter denew()
beperking bevat. De compiler kan niet afdwingen dat alle vereiste leden worden geïnitialiseerd in de algemene code. - De
required
wijzigingsfunctie is niet toegestaan voor de declaratie voor positionele parameters in een record. U kunt een expliciete declaratie toevoegen voor een positionele eigenschap die wel derequired
modifier bevat.
Sommige typen, zoals positionele records, gebruiken een primaire constructor om positionele eigenschappen te initialiseren. Als een van deze eigenschappen de required
modifier bevat, voegt de primaire constructor het kenmerk SetsRequiredMembers
toe. Dit geeft aan dat de primaire constructor alle vereiste leden initialiseert. U kunt uw eigen constructor schrijven met het kenmerk System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. De compiler controleert echter niet of deze constructors alle vereiste leden initialiseren. In plaats daarvan bevestigt het kenmerk aan de compiler dat de constructor alle vereiste leden initialiseert. Met het kenmerk SetsRequiredMembers
worden deze regels toegevoegd aan constructors:
- Een constructor die is gekoppeld aan een andere constructor die is geannoteerd met het kenmerk
SetsRequiredMembers
, ofwelthis()
, ofbase()
, moet ook het kenmerkSetsRequiredMembers
bevatten. Dit zorgt ervoor dat aanroepers alle relevante constructors correct kunnen gebruiken. - Kopieerconstructors die zijn gegenereerd voor
record
typen, hebben het kenmerkSetsRequiredMembers
toegepast als een van de ledenrequired
is.
Waarschuwing
De SetsRequiredMembers
schakelt de controles van de compiler uit zodat alle required
elementen worden geïnitialiseerd bij het creëren van een object. Wees voorzichtig.
De volgende code toont een klassehiërarchie die gebruikmaakt van de required
modifier voor de eigenschappen FirstName
en 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; }
}
Zie de C#11 - Vereiste leden functiespecificatie voor meer informatie over vereiste leden.