init (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.

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

A menudo, el descriptor de acceso init consta de una única instrucción que asigna un valor, como en el ejemplo anterior. Debido a init, lo siguiente no funciona:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor

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 tendrá 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;
    }
}

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

El descriptor de acceso init también se puede usar en propiedades implementadas automáticamente, como se muestra en el código de ejemplo siguiente:

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

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#.

Vea también