Usare i costruttori (Guida per programmatori C#)
Quando viene creata un'istanza di una classe
Nell'esempio seguente viene definita una classe denominata Taxi
usando un costruttore semplice. Questa classe viene quindi istanziata con l'operatore new
. Il runtime richiama il costruttore Taxi
immediatamente dopo l'allocazione della memoria per il nuovo oggetto.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
Un costruttore che non accetta parametri viene chiamato costruttore senza parametri . Il runtime invoca il costruttore senza parametri quando un oggetto viene istanziato usando l'operatore new
e non vengono forniti argomenti a new
. C# 12 ha introdotto costruttori primari. Un costruttore primario specifica i parametri che devono essere forniti per inizializzare un nuovo oggetto. Per ulteriori informazioni, vedere Costruttori di istanza .
A meno che la classe non sia statica, alle classi senza costruttori viene assegnato un costruttore pubblico senza parametri dal compilatore C# per abilitare la creazione di istanze della classe. Per ulteriori informazioni, vedere Classi Statiche e Membri di Classi Statiche.
È possibile impedire l'istanza di una classe rendendo privato il costruttore, come indicato di seguito:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Per altre informazioni, vedere Costruttori Privati.
I costruttori dei tipi di struct assomigliano ai costruttori di classi. Quando si istanzia un tipo struct con new
, il runtime invoca un costruttore. Quando un struct
è impostato sul relativo valore default
, il runtime inizializza tutta la memoria della struttura a 0. Se si dichiarano inizializzatori di campo in un tipo struct
, è necessario fornire un costruttore senza parametri. Per altre informazioni, vedere la sezione Inizializzazione delle struct e valori predefiniti dell'articolo Tipi di struttura.
Il codice seguente usa il costruttore senza parametri per Int32, in modo da assicurarsi che l'intero venga inizializzato:
int i = new int();
Console.WriteLine(i);
Il codice seguente, tuttavia, causa un errore del compilatore perché non usa new
e perché tenta di usare un oggetto non inizializzato:
int i;
Console.WriteLine(i);
In alternativa, alcuni tipi di struct
(inclusi tutti i tipi numerici predefiniti) possono essere inizializzati o assegnati e quindi usati come nell'esempio seguente:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Sia le classi che gli struct possono definire costruttori che accettano parametri, inclusi costruttori primari. I costruttori che accettano parametri devono essere chiamati tramite un'istruzione
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary) => Salary = annualSalary;
public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}
Questa classe può essere creata usando una delle istruzioni seguenti:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Un costruttore può usare la parola chiave base
per chiamare il costruttore di una classe base. Per esempio:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
In questo esempio viene chiamato il costruttore della classe base prima dell'esecuzione del blocco del costruttore. La parola chiave base
può essere usata con o senza parametri. Qualsiasi parametro del costruttore può essere usato come parametro per base
o come parte di un'espressione. Per altre informazioni, vedere base.
In una classe derivata, se un costruttore della classe base non viene chiamato in modo esplicito usando la parola chiave base
, il costruttore senza parametri, se presente, viene chiamato in modo implicito. Le dichiarazioni di costruttore seguenti sono effettivamente le stesse:
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
Se una classe base non offre un costruttore senza parametri, la classe derivata deve effettuare una chiamata esplicita a un costruttore di base usando base
.
Un costruttore può richiamare un altro costruttore nello stesso oggetto usando la parola chiave this
. Come base
, this
può essere usato con o senza parametri e tutti i parametri nel costruttore sono disponibili come parametri per this
o come parte di un'espressione. Ad esempio, il secondo costruttore dell'esempio precedente può essere riscritto usando this
:
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
L'uso della parola chiave this
nell'esempio precedente fa sì che venga chiamato il costruttore seguente:
public Employee(int annualSalary) => Salary = annualSalary;
I costruttori possono essere contrassegnati come public
, private
, protected
, interni, protetti da interni o private protected
. Questi modificatori di accesso definiscono il modo in cui gli utenti della classe possono costruire la classe . Per altre informazioni, vedere Modificatori di accesso.
Un costruttore può essere dichiarato statico usando la parola chiave static
. I costruttori statici vengono chiamati automaticamente, prima dell'accesso a tutti i campi statici e vengono usati per inizializzare i membri della classe statica. Per ulteriori informazioni, vedere Costruttori Statici.
Specifica del linguaggio C#
Per altre informazioni, vedere costruttori di istanze e costruttori statici nella specifica del linguaggio C#. La specifica del linguaggio è l'origine definitiva per la sintassi e l'utilizzo di C#.