init (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.

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; }
     }
}

Vaak bestaat de init accessor uit één instructie die een waarde toewijst, zoals in het vorige voorbeeld is gedaan. initVanwege, werkt het volgende niet:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor

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;
    }
}

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;
    }
}

De init toegangsfunctie kan ook worden gebruikt in automatisch geïmplementeerde eigenschappen, zoals in de volgende voorbeeldcode wordt gedemonstreerd:

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

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