Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A
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. Em contraste, uma propriedade implementada automaticamente com apenas um get acessório 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.
A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em versões preliminares públicas para a próxima versão da linguagem.
A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.
Sugestão
Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.
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. Pode fazer essa validação usando a field palavra-chave, introduzida em C# 14. A field palavra-chave acessa o campo de suporte sintetizado do compilador para essa propriedade. O exemplo seguinte mostra uma propriedade em que o init acessório 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");
}
}
}
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, como mostrado no seguinte exemplo:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
O exemplo seguinte mostra a distinção entre um private set, apenas leitura e init propriedade. Tanto a versão de conjunto privado como a versão de apenas leitura exigem que os chamadores usem o construtor adicionado para definir a propriedade nome. 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 objetos:
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#.