Delen via


Het init trefwoord (C#-verwijzing)

Het init trefwoord definieert een accessormethode in een eigenschap of indexeerfunctie. Een init-only setter wijst een waarde toe aan de eigenschap of het indexeerelement alleen tijdens de objectconstructie. Een init dwingt onveranderbaarheid af, zodat het object niet kan worden gewijzigd zodra het object is geïnitialiseerd. Een init accessor stelt het aanroepen van code in staat om een object-initializer te gebruiken om de initiële waarde in te stellen. Als contrast moet een automatisch geïmplementeerde eigenschap met alleen een get setter worden geïnitialiseerd door een constructor aan te roepen. Een eigenschap met een private set accessor kan na de constructie worden gewijzigd, maar alleen in de klasse.

De volgende code demonstreert een init accessor in een automatisch geïmplementeerde eigenschap:

class Person_InitExampleAutoProperty
{
    public int YearOfBirth { get; init; }
}

Mogelijk moet u een van de accessors implementeren om parametervalidatie te bieden. U kunt dit doen met behulp van het field trefwoord, geïntroduceerd als preview-functie in C# 13. Het field trefwoord heeft toegang tot het gesynthetiseerde backingveld van de compiler voor die eigenschap. In het volgende voorbeeld ziet u een eigenschap waarin de init toegangsfunctie het bereik van de value parameter valideert"

class Person_InitExampleFieldProperty
{
    public int YearOfBirth
    {
        get;
        init
        {
            field = (value <= DateTime.Now.Year)
                ? value
                : throw new ArgumentOutOfRangeException(nameof(value), "Year of birth can't be in the future");
        }
    }
}

Belangrijk

Het field trefwoord is een preview-functie in C# 13. U moet .NET 9 gebruiken en het <LangVersion> element preview instellen op in uw projectbestand om het field contextuele trefwoord te kunnen gebruiken.

Wees voorzichtig met het gebruik van de trefwoordfunctie in een klasse met een veld met de field naam field. Het nieuwe field trefwoord schaduwt een veld met de naam field in het bereik van een eigenschapstoegangsor. U kunt de naam van de field variabele wijzigen of het @ token gebruiken om naar de field id te verwijzen.@field Meer informatie vindt u door de functiespecificatie voor het field trefwoord te lezen.

De init toegangsfunctie kan worden gebruikt als een expressie-lichaamslid. Voorbeeld:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

    public int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

In het volgende voorbeeld worden zowel een get als een init accessor gedefinieerd voor een eigenschap met de naam YearOfBirth. Er wordt een privéveld gebruikt dat de eigenschapswaarde _yearOfBirth back-up maakt.

class Person_InitExample
{
     private int _yearOfBirth;

     public int YearOfBirth
     {
         get { return _yearOfBirth; }
         init { _yearOfBirth = value; }
     }
}

Een init accessor dwingt bellers niet af om de eigenschap in te stellen. In plaats daarvan kunnen bellers een object-initialisatiefunctie gebruiken terwijl latere aanpassingen worden verboden. U kunt de required wijzigingsfunctie toevoegen om bellers te dwingen een eigenschap in te stellen. In het volgende voorbeeld ziet u een init enige eigenschap met een waardetype dat null kan worden gebruikt als back-upveld. Als een aanroeper de YearOfBirth eigenschap niet initialiseert, heeft die eigenschap de standaardwaarde null :

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

    public int? YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Als u wilt afdwingen dat bellers een initiële niet-null-waarde instellen, voegt u de required wijziging toe, zoals wordt weergegeven in het volgende voorbeeld:

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

    public required int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

In het volgende voorbeeld ziet u het onderscheid tussen een private set, alleen-lezen en init een eigenschap. Zowel de versie van de privéset als de alleen-lezenversie vereisen dat bellers de toegevoegde constructor gebruiken om de naameigenschap in te stellen. Met de private set versie kan een persoon de naam wijzigen nadat het exemplaar is samengesteld. Voor de init versie is geen constructor vereist. Bellers kunnen de eigenschappen initialiseren met behulp van een object-initialisatiefunctie:

class PersonPrivateSet
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);

    public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}

class PersonReadOnly
{
    public string FirstName { get; }
    public string LastName { get; }
    public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}

class PersonInit
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };

C#-taalspecificatie

Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.

Zie ook