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 init
nastę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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla