init (справочник по C#)
Ключевое слово init
определяет метод доступа в свойстве или индексаторе. Метод задания только для инициализации назначает значение свойству или элементу индексатора только во время построения объекта. Принудительное init
применение неизменяемости, поэтому после инициализации объекта его нельзя изменить. Метод init
доступа позволяет вызывать код для использования инициализатора объектов для задания начального значения. В отличие от этого, автоматически реализованное свойство с параметром get
задания должно быть инициализировано путем вызова конструктора. Свойство с методом private set
доступа можно изменить после построения, но только в классе.
В приведенном ниже примере определен как метод доступа get
, так и метод доступа init
для свойства с именем YearOfBirth
. Для возвращения значения свойства в нем используется закрытое поле с именем _yearOfBirth
.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
Метод доступа init
часто состоит из одного оператора, который присваивает значение, как в предыдущем примере. init
Из-за этого не работает следующее:
var john = new Person_InitExample
{
YearOfBirth = 1984
};
john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor
Метод init
доступа не принудительно задает свойство вызывающим абонентам. Вместо этого он позволяет вызывающим пользователям использовать инициализатор объектов при запрете последующего изменения. Модификатор можно добавить required
для принудительного задания свойства вызывающим. В следующем примере показано init
только свойство с типом значения NULL в качестве резервного поля. Если вызывающий объект не инициализирует YearOfBirth
свойство, это свойство будет иметь значение по умолчанию null
:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Чтобы принудительно задать начальное значение, отличное от NULL, добавьте required
модификатор, как показано в следующем примере:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Метод init
доступа можно использовать в качестве элемента с выражением. Пример:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Метод init
доступа также можно использовать в свойствах автоимплирования, как показано в следующем примере кода:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
В следующем примере показано различие только для private set
чтения и init
свойства. Приватный набор версии и единственная версия для чтения требуют, чтобы вызывающие пользователи использовали добавленный конструктор для задания свойства name. Версия private set
позволяет пользователю изменить свое имя после создания экземпляра. Версия init
не требует конструктора. Вызывающие объекты могут инициализировать свойства с помощью инициализатора объектов:
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" };
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.