vereiste modifier (C#-verwijzing)
De required
wijzigingsfunctie geeft aan dat het veld of de eigenschap waarop het wordt toegepast, moet worden geïnitialiseerd door een object-initialisatiefunctie. Elke expressie die een nieuw exemplaar van het type initialiseert, moet alle vereiste leden initialiseren. De required
wijzigingsfunctie is beschikbaar vanaf C# 11. Met de required
wijzigingsfunctie 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
wijzigingsfunctie kan worden toegepast op velden en eigenschappen die zijn gedeclareerd instruct
, enclass
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 tot
null
. Als het type een niet-null-referentietype is, geeft de compiler een waarschuwing uit als u het lid initialiseert naarnull
. De compiler geeft een fout op als het lid helemaal niet is geïnitialiseerd. - Vereiste leden moeten minstens zo zichtbaar zijn als hun type. Een
public
klasse kan bijvoorbeeld geen veld bevattenrequired
dat isprotected
. Bovendien moeten vereiste eigenschappen setters (set
ofinit
accessors) hebben die minstens zo zichtbaar zijn als de typen. Leden die niet toegankelijk zijn, kunnen niet worden ingesteld door code waarmee een exemplaar wordt gemaakt. - Afgeleide klassen kunnen een
required
lid dat is gedeclareerd in de basisklasse niet verbergen. Als u een vereist lid verbergt, voorkomt u dat bellers object-initializers gebruiken. Bovendien moeten afgeleide typen die een vereiste eigenschap overschrijven, derequired
wijzigingsfunctie bevatten. Het afgeleide type kan derequired
status niet verwijderen. Afgeleide typen kunnen derequired
wijzigingsfunctie toevoegen bij het overschrijven van een eigenschap. - Een type met leden
required
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
wijzigingsfunctie bevat.
Sommige typen, zoals positionele records, gebruiken een primaire constructor om positionele eigenschappen te initialiseren. Als een van deze eigenschappen de required
wijzigingsfunctie bevat, voegt de primaire constructor het SetsRequiredMembers
kenmerk toe. Dit geeft aan dat de primaire constructor alle vereiste leden initialiseert. U kunt uw eigen constructor schrijven met het System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute kenmerk. 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 SetsRequiredMembers
het kenmerk worden deze regels toegevoegd aan constructors:
- Een constructor die is gekoppeld aan een andere constructor die is geannoteerd met het
SetsRequiredMembers
kenmerk, ofthis()
base()
, moet ook hetSetsRequiredMembers
kenmerk bevatten. Dit zorgt ervoor dat bellers alle juiste constructors correct kunnen gebruiken. - Kopieerconstructors die worden gegenereerd voor
record
typen, hebben hetSetsRequiredMembers
kenmerk toegepast als een van de leden isrequired
.
Waarschuwing
Hiermee SetsRequiredMembers
worden de controles van de compiler uitgeschakeld dat alle required
leden worden geïnitialiseerd wanneer een object wordt gemaakt. Wees voorzichtig.
De volgende code toont een klassehiërarchie die gebruikmaakt van de required
wijzigingsfunctie voor de FirstName
en LastName
eigenschappen:
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 functiespecificatie C#11 - Vereiste leden voor meer informatie over vereiste leden .