Uso dei 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 dall'operatore nuovo. Il costruttore Taxi
viene richiamato dall'operatore new
immediatamente dopo l'allocazione della memoria per il nuovo oggetto.
public class Taxi
{
public bool IsInitialized;
public Taxi()
{
IsInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
Console.WriteLine(t.IsInitialized);
}
}
Un costruttore che non accetta parametri viene chiamato costruttore senza parametri . I costruttori senza parametri vengono richiamati ogni volta che viene creata un'istanza di un oggetto usando l'operatore new
e non vengono forniti argomenti per new
. C# 12 introduce 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 viene creata un'istanza di un tipo struct con new
, viene richiamato 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 che non è stato inizializzato:
int i;
Console.WriteLine(i);
In alternativa, gli oggetti basati su structs
(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, il costruttore della classe base viene chiamato prima che venga eseguito il 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 questo costruttore venga chiamato:
public Employee(int annualSalary)
{
Salary = annualSalary;
}
I costruttori possono essere contrassegnati come pubblico, privato, protetto, interno, protetto interno o protetto privato. 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 statica
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#.