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

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

Spesso la funzione di accesso init è costituita da una singola istruzione che assegna un valore, come nell'esempio precedente. A causa di init, l'esempio seguente non funziona:

var john = new Person_InitExample
{
    YearOfBirth = 1984
};

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

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 proprietà YearOfBirth, tale proprietà avrà 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;
    }
}

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

La funzione di accesso init può essere usata anche nelle proprietà implementate automaticamente, come illustrato nel codice di esempio seguente:

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

Nell'esempio seguente viene illustrata la distinzione tra una private setproprietà , di sola lettura e 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