init (Referenční dokumentace jazyka 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í příklad definuje jak a getinit 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řistupování init se často skládá z jednoho příkazu, který přiřazuje hodnotu, jak tomu bylo v předchozím příkladu. Z důvodu init, následující nefunguje :

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

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

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 neinicializuje YearOfBirth , bude mít 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;
    }
}

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

Přístupové init objekty lze také použít v automaticky naváděných vlastnostech, jak ukazuje následující příklad kódu:

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

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é