Condividi tramite


Parola init chiave (Riferimenti per C#)

La parola chiave init definisce un metodo della funzione di accesso in una proprietà o in un indicizzatore. Un setter init-only assegna un valore alla proprietà o all'elemento indicizzatore solo durante la costruzione di oggetti. Un oggetto init applica l'immutabilità, in modo che una volta inizializzato l'oggetto, non possa essere modificato. Una funzione di accesso init consente al codice chiamante di usare un inizializzatore di oggetto per impostare il valore iniziale. Al contrario, una proprietà implementata automaticamente con solo un get setter deve essere inizializzata chiamando un costruttore. Una proprietà con una funzione di accesso private set può essere modificata dopo la costruzione, ma solo nella classe.

Il codice seguente illustra una init funzione di accesso in una proprietà implementata automaticamente:

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

Potrebbe essere necessario implementare una delle funzioni di accesso per fornire la convalida dei parametri. A tale scopo, è possibile usare la field parola chiave , introdotta come funzionalità di anteprima in C# 13. La field parola chiave accede al campo sottostante sintetizzato dal compilatore per tale proprietà. L'esempio seguente mostra una proprietà in cui la init funzione di accesso convalida l'intervallo del value parametro"

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 parola chiave è una funzionalità di anteprima in C# 13. È necessario usare .NET 9 e impostare l'elemento <LangVersion> su preview nel file di progetto per usare la field parola chiave contestuale.

È consigliabile prestare attenzione usando la funzionalità parola field chiave in una classe con un campo denominato field. La nuova field parola chiave ombreggiate un campo denominato field nell'ambito di una funzione di accesso alle proprietà. È possibile modificare il nome della field variabile oppure usare il @ token per fare riferimento all'identificatore field come @field. Per altre informazioni, leggere la specifica della funzionalità per la field parola chiave .

La funzione di accesso init può essere usata come membro con corpo di espressione. Esempio:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

    public int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

L'esempio seguente definisce le funzioni di accesso get e init per una proprietà denominata YearOfBirth. Usa il campo privato denominato _yearOfBirth per portare in secondo piano il valore della proprietà.

class Person_InitExample
{
     private int _yearOfBirth;

     public int YearOfBirth
     {
         get { return _yearOfBirth; }
         init { _yearOfBirth = value; }
     }
}

Una funzione di accesso init non forza i chiamanti a impostare la proprietà. Consente invece ai chiamanti di usare un inizializzatore di oggetto, vietando la modifica successiva. È possibile aggiungere il modificatore required per forzare i chiamanti a impostare una proprietà. L'esempio seguente mostra una proprietà init only con un tipo valore che ammette i valori Null come campo sottostante. Se un chiamante non inizializza la YearOfBirth proprietà, tale proprietà ha il valore predefinito null :

class Person_InitExampleNullability
{
    private int? _yearOfBirth;

    public int? YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

Per forzare i chiamanti a impostare un valore iniziale non Null, aggiungere il modificatore required, come illustrato nell'esempio seguente:

class Person_InitExampleNonNull
{
    private int _yearOfBirth;

    public required int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

L'esempio seguente mostra la distinzione tra una proprietà private set, di sola lettura e la proprietà init. Sia la versione private set che la versione read only richiedono ai chiamanti di usare il costruttore aggiunto per impostare la proprietà name. La versione private set consente a una persona di modificare il nome dopo la costruzione dell'istanza. La versione init non richiede un costruttore. I chiamanti possono inizializzare le proprietà usando un inizializzatore di oggetto:

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

Specifiche del linguaggio C#

Per altre informazioni, vedere la specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Vedi anche