Partilhar via


A init palavra-chave (Referência C#)

A init palavra-chave define um método de acessador em uma propriedade ou indexador. Um setter init-only atribui um valor à propriedade ou ao elemento indexador somente durante a construção do objeto. Um init impõe a imutabilidade, de modo que, uma vez que o objeto é inicializado, ele não pode ser alterado. Um init acessador permite que o código de chamada use um inicializador de objeto para definir o valor inicial. Por outro lado, uma propriedade implementada automaticamente com apenas um get setter deve ser inicializada chamando um construtor. Um imóvel com acessório private set pode ser modificado após a construção, mas apenas na classe.

O código a seguir demonstra um init acessador em uma propriedade implementada automaticamente:

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

Talvez seja necessário implementar um dos acessadores para fornecer validação de parâmetros. Você pode fazer isso usando a palavra-chave, introduzida field como um recurso de visualização no C# 13. A field palavra-chave acessa o campo de suporte sintetizado do compilador para essa propriedade. O exemplo a seguir mostra uma propriedade onde o init acessador valida o intervalo do value parâmetro"

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

Importante

A field palavra-chave é um recurso de visualização em C# 13. Você deve estar usando o .NET 9 e definir seu <LangVersion> elemento como preview em seu arquivo de projeto para usar a field palavra-chave contextual.

Você deve ter cuidado ao usar o recurso de field palavra-chave em uma classe que tem um campo chamado field. A nova field palavra-chave sombreia um campo nomeado field no escopo de um acessador de propriedade. Você pode alterar o nome da field variável ou usar o @ token para fazer referência ao field identificador como @field. Você pode saber mais lendo a especificação do recurso para a field palavra-chave.

O init acessador pode ser usado como um membro com corpo de expressão. Exemplo:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

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

O exemplo a seguir define um get e um init acessador para uma propriedade chamada YearOfBirth. Ele usa um campo privado nomeado _yearOfBirth para apoiar o valor da propriedade.

class Person_InitExample
{
     private int _yearOfBirth;

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

Um init acessador não força os chamadores a definir a propriedade. Em vez disso, ele permite que os chamadores usem um inicializador de objeto, proibindo modificações posteriores. Você pode adicionar o modificador para forçar os required chamadores a definir uma propriedade. O exemplo a seguir mostra uma init propriedade only com um tipo de valor anulável como seu campo de apoio. Se um chamador não inicializar a YearOfBirth propriedade, essa propriedade terá o valor padrão null :

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

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

Para forçar os chamadores a definir um valor inicial não nulo, adicione o required modificador, conforme mostrado no exemplo a seguir:

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

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

O exemplo a seguir mostra a distinção entre um private set, somente leitura e init propriedade. Tanto a versão do conjunto privado quanto a versão somente leitura exigem que os chamadores usem o construtor adicionado para definir a propriedade name. A private set versão permite que uma pessoa altere seu nome depois que a instância é construída. A init versão não requer um construtor. Os chamadores podem inicializar as propriedades usando um inicializador de objeto:

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

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso do C#.

Consulte também