Condividi tramite


Usare i costruttori (Guida per programmatori C#)

Quando viene creata un'istanza di una classe o struct, il runtime chiama il relativo costruttore. I costruttori hanno lo stesso nome della classe o dello struct e in genere inizializzano i membri dati del nuovo oggetto.

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 newe 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 o un'istruzione base . Le classi e gli struct possono anche definire più costruttori e nessuno dei due è necessario per definire un costruttore senza parametri. Per esempio:

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

Vedere anche