Klíčové slovo (Referenční dokumentace jazyka init
C#)
Klíčové init
slovo definuje metodu přístupového objektu ve vlastnosti nebo indexeru. Init-only setter přiřadí hodnotu vlastnosti nebo indexer element pouze během vytváření objektu. Vynucuje init
neměnnost, takže po inicializaci objektu není možné ho změnit. Přístupový init
objekt umožňuje volání kódu použít inicializátor objektů k nastavení počáteční hodnoty. Naproti tomu automaticky implementovaná vlastnost pouze get
setter musí být inicializována voláním konstruktoru. Vlastnost s příslušenstvím private set
lze po konstrukci upravit, ale pouze ve třídě.
Následující kód ukazuje init
přístup v automaticky implementované vlastnosti:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
Možná budete muset implementovat některý z přístupových objektů, aby bylo možné zajistit ověření parametru. Můžete to udělat pomocí klíčového field
slova, představeného jako funkce preview v C# 13. Klíčové field
slovo přistupuje k syntetizovanému záložnímu poli kompilátoru pro danou vlastnost. Následující příklad ukazuje vlastnost, kde init
přístup ověřuje rozsah parametru value
"
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");
}
}
}
Důležité
Klíčové field
slovo je funkce preview v jazyce C# 13. Pokud chcete použít field
kontextové klíčové slovo, musíte použít .NET 9 a nastavit prvek <LangVersion>
do preview
souboru projektu.
Měli byste být opatrní pomocí funkce klíčového field
slova ve třídě, která má pole s názvem field
. Nové field
klíčové slovo stínuje pole pojmenované field
v oboru přístupového objektu vlastnosti. Můžete změnit název field
proměnné nebo pomocí @
tokenu odkazovat na field
identifikátor jako @field
. Další informace najdete ve specifikaci funkce pro field
klíčové slovo.
Přístupové init
objekty lze použít jako člen s výrazem. Příklad:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Následující příklad definuje jak a get
init
příslušenství pro vlastnost s názvem YearOfBirth
. Používá soukromé pole pojmenované _yearOfBirth
k vrácení hodnoty vlastnosti.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
Přistupující init
objekt nevynucuje volajícím nastavit vlastnost. Místo toho umožňuje volajícím používat inicializátor objektů při zakázání pozdějších úprav. Modifikátor můžete přidat required
tak, aby volající nastavil vlastnost. Následující příklad ukazuje init
jedinou vlastnost s typem hodnoty nullable jako jeho backing pole. Pokud volající vlastnost inicializuje YearOfBirth
, má tato vlastnost výchozí null
hodnotu:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Chcete-li vynutit, aby volající nastavil počáteční nenulovou hodnotu, přidejte required
modifikátor, jak je znázorněno v následujícím příkladu:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Následující příklad ukazuje rozdíl mezi private set
, jen pro čtení a init
vlastnost. Verze privátní sady i verze jen pro čtení vyžadují volající, aby použili přidaný konstruktor k nastavení vlastnosti name. Verze private set
umožňuje, aby osoba po vytvoření instance změnila své jméno. Verze init
nevyžaduje konstruktor. Volající mohou inicializovat vlastnosti pomocí inicializátoru objektů:
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" };
specifikace jazyka C#
Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.