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