init (odwołanie w C#)

Słowo init kluczowe definiuje metodę dostępu we właściwości lub indeksatorze. Inicjator tylko inicjowania przypisuje wartość do właściwości lub elementu indeksatora tylko podczas budowy obiektu. Element init wymusza niezmienność, dzięki czemu po zainicjowaniu obiektu nie można go zmienić. Metoda init dostępu umożliwia wywoływanie kodu, aby użyć inicjatora obiektu w celu ustawienia wartości początkowej. Natomiast właściwość implementowana automatycznie z tylko elementem get ustawiający musi zostać zainicjowana przez wywołanie konstruktora. Właściwość z akcesorem private set można zmodyfikować po konstrukcji, ale tylko w klasie.

W poniższym przykładzie zdefiniowano metodę get i metodę init dostępu dla właściwości o nazwie YearOfBirth. Używa pola prywatnego o nazwie _yearOfBirth , aby przywrócić wartość właściwości.

class Person_InitExample
{
     private int _yearOfBirth;

     public int YearOfBirth
     {
         get { return _yearOfBirth; }
         init { _yearOfBirth = value; }
     }
}

init Często akcesorium składa się z pojedynczej instrukcji, która przypisuje wartość, tak jak w poprzednim przykładzie. Ze względu na program initnastępujące elementy nie działają:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

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

Akcesorium init nie wymusza ustawiania właściwości przez obiekt wywołujący. Zamiast tego umożliwia obiektom wywołującym używanie inicjatora obiektów, jednocześnie zabraniając późniejszej modyfikacji. Możesz dodać modyfikator, required aby wymusić, aby wywołujące ustawiły właściwość. W poniższym przykładzie pokazano init tylko właściwość z typem wartości dopuszczającej wartość null jako polem zapasowym. Jeśli obiekt wywołujący nie inicjuje YearOfBirth właściwości, ta właściwość będzie miała wartość domyślną null :

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

    public int? YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Aby wymusić ustawienie początkowej wartości innej niż null, należy dodać required modyfikator, jak pokazano w poniższym przykładzie:

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

    public required int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Akcesorium init może służyć jako składowa wyrażeń. Przykład:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

    public int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Metodę init dostępu można również używać we właściwościach automatycznie, jak pokazano w poniższym przykładowym kodzie:

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

W poniższym przykładzie pokazano rozróżnienie między właściwością private set, tylko do odczytu i init właściwością. Zarówno wersja zestawu prywatnego, jak i wersja tylko do odczytu wymagają od wywołujących użycia dodanego konstruktora w celu ustawienia właściwości name. Wersja private set umożliwia osobie zmianę nazwy po utworzeniu wystąpienia. Wersja init nie wymaga konstruktora. Obiekt wywołujący może zainicjować właściwości za pomocą inicjatora obiektu:

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

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też