Sdílet prostřednictvím


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#.

Viz také