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. init
Vanwege, 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.