Delen via


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 in struct, en op class typen, inclusief record en record struct typen. De required wijzigingsfunctie kan niet worden toegepast op leden van een interface.
  • 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 naar null. 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 geen required veld bevatten dat protectedis. Bovendien moeten vereiste eigenschappen setters (set- of init-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 de required modifier bevatten. Het afgeleide type kan de status required niet verwijderen. Afgeleide typen kunnen de required modifier toevoegen bij het overschrijven van een eigenschap.
  • Een type met required leden kan niet worden gebruikt als een typeargument wanneer de typeparameter de new() 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 de required 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, ofwel this(), of base(), moet ook het kenmerk SetsRequiredMembers bevatten. Dit zorgt ervoor dat aanroepers alle relevante constructors correct kunnen gebruiken.
  • Kopieerconstructors die zijn gegenereerd voor record typen, hebben het kenmerk SetsRequiredMembers toegepast als een van de leden requiredis.

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.