Palabra init
clave (Referencia de C#)
La palabra clave init
define un método de descriptor de acceso en una propiedad o indexador. Un establecedor de solo inicio asigna un valor a la propiedad o al elemento indexador únicamente durante la construcción de objetos. Un init
impone la inmutabilidad, de modo que una vez inicializado el objeto, no puede ser modificado. Un init
descriptor de acceso permite llamar al código para usar un inicializador de objeto para establecer el valor inicial. Por el contrario, una propiedad implementada automáticamente con solo un get
establecedor debe inicializarse llamando a un constructor. Una propiedad con un private set
descriptor de acceso se puede modificar después de la construcción, pero solo en la clase.
El código siguiente muestra un init
descriptor de acceso en una propiedad implementada automáticamente:
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
Es posible que tenga que implementar uno de los descriptores de acceso para proporcionar validación de parámetros. Puede hacerlo con la field
palabra clave , introducida como una característica en versión preliminar en C# 13. La field
palabra clave tiene acceso al campo de respaldo sintetizado del compilador para esa propiedad. En el ejemplo siguiente se muestra una propiedad en la que el init
descriptor de acceso valida el intervalo del 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
La field
palabra clave es una característica en versión preliminar en C# 13. Debe usar .NET 9 y establecer el <LangVersion>
elemento preview
en en el archivo de proyecto para poder usar la field
palabra clave contextual.
Debe tener cuidado con el uso de la field
característica de palabra clave en una clase que tenga un campo denominado field
. La nueva field
palabra clave sombrea un campo denominado field
en el ámbito de un descriptor de acceso de propiedad. Puede cambiar el nombre de la field
variable o usar el @
token para hacer referencia al field
identificador como @field
. Para más información, lea la especificación de características de la field
palabra clave .
El descriptor de acceso init
se puede usar como miembro con forma de expresión. Ejemplo:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
En el ejemplo siguiente se definen los descriptores de acceso get
y init
para una propiedad denominada YearOfBirth
. Usa un campo privado denominado _yearOfBirth
para respaldar el valor de la propiedad.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
Un descriptor de acceso init
no obliga a los autores de llamada a establecer la propiedad. En su lugar, permite a los autores de llamadas usar un inicializador de objeto mientras prohíbe la modificación posterior. Puede agregar el modificador required
para obligar a los autores de la llamada a establecer la propiedad. En el ejemplo siguiente se muestra una init
única propiedad con un tipo de valor que acepta valores NULL como campo de respaldo. Si un autor de llamada no inicializa la YearOfBirth
propiedad , esa propiedad tiene el valor predeterminado null
:
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Para forzar a los autores de llamada a establecer un valor inicial que no sea NULL, agregue el required
modificador, como se muestra en el ejemplo siguiente:
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
En el ejemplo siguiente se muestra la distinción entre un private set
, solo lectura y una propiedad init
. Tanto la versión del conjunto privado como la versión de solo lectura requieren que los autores de llamada usen el constructor agregado para establecer la propiedad name. La private set
versión permite a una persona cambiar su nombre después de construir la instancia. La init
versión no requiere un constructor. Los autores de llamadas pueden inicializar las propiedades mediante un 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" };
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.