Nota
L'accés a aquesta pàgina requereix autorització. Pots provar d'iniciar sessió o canviar de directori.
L'accés a aquesta pàgina requereix autorització. Pots provar de canviar directoris.
Palabra
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 descriptor de acceso 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.
La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.
La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.
Sugerencia
Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.
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 realizar esa validación mediante la field palabra clave , introducida en C# 14. La field palabra clave tiene acceso al campo de respaldo sintetizado del compilador para esa propiedad. En el ejemplo siguiente se muestra una propiedad donde 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");
}
}
}
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 una private setpropiedad , de solo lectura y 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#.