Costruttori (Guida per programmatori C#)
Un costruttore è un metodo chiamato dal runtime quando viene creata un'istanza di una classe o di una struct . Una classe o uno struct può avere più costruttori che accettano argomenti diversi. I costruttori consentono di assicurarsi che le istanze del tipo siano valide quando vengono create. Per ulteriori informazioni ed esempi, vedere Costruttori di istanze e Uso dei costruttori.
Esistono diverse azioni che fanno parte dell'inizializzazione di una nuova istanza. Le azioni seguenti sono eseguite nell'ordine seguente:
- I campi di istanza sono impostati su 0. Questa inizializzazione viene in genere eseguita dal runtime.
- gli inizializzatori di campo vengono eseguiti. Inizializzatori di campo nell'esecuzione del tipo più derivato.
- Gli inizializzatori di campo del tipo base vengono eseguiti. Inizializzatori di campo che partono dalla base diretta e attraversano ogni tipo di base fino a System.Object.
- i costruttori dell'istanza base vengono eseguiti. Tutti i costruttori di istanza, a partire da Object.Object attraverso ciascuna classe di base fino alla classe base diretta.
- Il costruttore dell'istanza esegue. Viene eseguito il costruttore dell'istanza per il tipo .
- Gli inizializzatori dell'oggetto vengono eseguiti. Se l'espressione include gli inizializzatori di oggetti, vengono eseguiti dopo l'esecuzione del costruttore dell'istanza. Gli inizializzatori di oggetti vengono eseguiti nell'ordine testuale.
Le azioni precedenti avvengono quando viene creata un'istanza usando l'operatore new
. Se una nuova istanza di un struct
è impostata sul relativo valore default
, tutti i campi dell'istanza vengono impostati su 0. Gli elementi di una matrice vengono impostati sul valore predefinito 0 o null
quando viene creata una matrice.
Il costruttore statico , se presente, viene eseguito prima delle azioni del costruttore di istanze per qualsiasi istanza del tipo. Il costruttore statico viene eseguito al massimo una volta.
Sintassi del costruttore
Un costruttore è un metodo con lo stesso nome del tipo. La firma del metodo può includere un modificatore di accesso facoltativo , il nome del metodo e il relativo elenco di parametri; non include un tipo restituito. Nell'esempio seguente viene illustrato il costruttore di una classe denominata Person
.
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
Se un costruttore può essere implementato come singola istruzione, è possibile usare un membro con corpo di espressione . Nell'esempio seguente viene definita una classe Location
il cui costruttore ha un singolo parametro stringa denominato nome. La definizione del corpo dell'espressione assegna l'argomento al campo locationName
.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Se un tipo richiede un parametro per creare un'istanza, è possibile usare un costruttore primario per indicare che uno o più parametri sono necessari per istanziare il tipo, come illustrato nell'esempio seguente.
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
Costruttori statici
Negli esempi precedenti vengono illustrati i costruttori di istanza, che inizializzano un nuovo oggetto. Una classe o uno struct può anche dichiarare un costruttore statico, che inizializza i membri statici del tipo. I costruttori statici sono senza parametri. Se non si fornisce un costruttore statico per inizializzare i campi statici, il compilatore C# inizializza i campi statici sul valore predefinito, come indicato nell'articolo Valori predefiniti dei tipi C# articolo.
Nell'esempio seguente viene utilizzato un costruttore statico per inizializzare un campo statico.
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
È anche possibile definire un costruttore statico con una definizione del corpo dell'espressione, come illustrato nell'esempio seguente.
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
Per altre informazioni ed esempi, vedere Costruttori Statici.