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