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.