Udostępnij za pośrednictwem


Słowo init kluczowe (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 automatycznie zaimplementowana właściwość z tylko elementem get setter musi zostać zainicjowana przez wywołanie konstruktora. Właściwość z akcesorem private set można zmodyfikować po konstrukcji, ale tylko w klasie.

Poniższy kod demonstruje metodę init dostępu we właściwości implementowane automatycznie:

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

Może być konieczne zaimplementowanie jednego z metod dostępu w celu zapewnienia weryfikacji parametrów. Możesz to zrobić, używając słowa kluczowego field wprowadzonego jako funkcja w wersji zapoznawczej w języku C# 13. Słowo field kluczowe uzyskuje dostęp do pola syntetyzowanego kopii zapasowej kompilatora dla tej właściwości. W poniższym przykładzie pokazano właściwość, w której metodę init dostępu weryfikuje zakres 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");
        }
    }
}

Ważne

Słowo field kluczowe jest funkcją w wersji zapoznawczej w języku C# 13. Musisz użyć platformy .NET 9 i ustawić element <LangVersion> na preview w pliku projektu, aby użyć field kontekstu słowa kluczowego.

Należy zachować ostrożność przy użyciu funkcji słowa kluczowego field w klasie, która ma pole o nazwie field. Nowe field słowo kluczowe cieniuje pole o nazwie field w zakresie metody dostępu właściwości. Możesz zmienić nazwę zmiennej field lub użyć tokenu @ , aby odwołać się do identyfikatora field jako @field. Aby dowiedzieć się więcej, przeczytaj specyfikację funkcji słowa kluczowego field.

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

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

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ść ma 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;
    }
}

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ż