Share via


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 in struct, en 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 tot null. Als het type een niet-null-referentietype is, geeft de compiler een waarschuwing uit als u het lid initialiseert naar null. 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 bevatten required dat is protected. Bovendien moeten vereiste eigenschappen setters (set of init 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, de required wijzigingsfunctie bevatten. Het afgeleide type kan de required status niet verwijderen. Afgeleide typen kunnen de required wijzigingsfunctie toevoegen bij het overschrijven van een eigenschap.
  • Een type met leden required 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 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 het SetsRequiredMembers kenmerk bevatten. Dit zorgt ervoor dat bellers alle juiste constructors correct kunnen gebruiken.
  • Kopieerconstructors die worden gegenereerd voor record typen, hebben het SetsRequiredMembers kenmerk toegepast als een van de leden is required.

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 .