Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De required wijzigingsfunctie geeft aan dat het veld of de eigenschap waarop het van toepassing is, moet worden geïnitialiseerd door een object-initialisatiefunctie. Elke expressie die een nieuw exemplaar van het type initialiseert, moet alle vereiste ledeninitialiseren. De required modifier is beschikbaar vanaf C# 11.
De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.
De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.
Aanbeveling
Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.
Met behulp van de required modifier kunnen ontwikkelaars typen maken waarbij eigenschappen of velden correct moeten worden geïnitialiseerd, maar nog steeds initialisatie via objectinitialisaties toestaan. Verschillende regels zorgen voor dit gedrag:
- Pas de
requiredwijzigingsfunctie toe op velden en eigenschappen die zijn gedeclareerd instructenclasstypen, inclusiefrecordenrecord structtypen. U kunt derequiredwijzigingsfunctie niet toepassen op leden van eeninterface. - U kunt expliciete interface-implementaties niet markeren als
required. U kunt ze niet instellen in object initializers. - U moet de vereiste leden initialiseren, maar u kunt ze initialiseren naar
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 geenrequiredveld bevatten datprotectedis. Bovendien moeten vereiste eigenschappen setters (set- ofinit-accessors) hebben die minstens zo zichtbaar zijn als de typen waarin ze zich bevinden. Code waarmee een exemplaar wordt gemaakt, kan geen leden instellen die niet toegankelijk zijn. - Afgeleide klassen kunnen een
requiredlid 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 derequiredmodifier bevatten. Het afgeleide type kan de statusrequiredniet verwijderen. Afgeleide typen kunnen derequiredmodifier toevoegen bij het overschrijven van een eigenschap. - U kunt geen type gebruiken met
requiredleden 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. - U kunt de
requiredwijzigingsfunctie niet gebruiken voor de declaratie voor positionele parameters in een record. U kunt een expliciete declaratie toevoegen voor een positionele eigenschap die wel derequiredmodifier 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 kenmerk 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 kenmerkSetsRequiredMembersbevatten. Dit zorgt ervoor dat aanroepers alle relevante constructors correct kunnen gebruiken. - Kopieerconstructors die zijn gegenereerd voor
recordtypen, hebben het kenmerkSetsRequiredMemberstoegepast als een van de ledenrequiredis.
Waarschuwing
Het SetsRequiredMembers kenmerk schakelt de controles van de compiler uit 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 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.