Compartir a través de


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

Consulte también