Condividi tramite


Utilizzo di costruttori (Guida per programmatori C#)

I costruttori sono metodi di classe che vengono eseguiti durante la creazione di un oggetto di un tipo specifico. Hanno lo stesso nome della classe e in genere inizializzano i membri dati del nuovo oggetto.

Nell'esempio seguente viene definita una classe denominata Taxi con un costruttore semplice. Viene quindi creata un'istanza di questa classe con l'operatore new. 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);
    }
}

I costruttori predefiniti, ossia che non accettano parametri, vengono richiamati ogni volta che viene creata un'istanza di un oggetto utilizzando l'operatore new e non vengono forniti argomenti a new. Per ulteriori informazioni, vedere Costruttori di istanze (Guida per programmatori C#).

A meno che non siano statiche, le classi senza costruttori ricevono un costruttore predefinito pubblico dal compilatore C# per consentire la creazione di istanze. Per ulteriori informazioni, vedere Classi statiche e membri di classi statiche (Guida per programmatori C#).

È possibile impedire la creazione di istanze di una classe rendendo privato il costruttore, come riportato di seguito:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

Per ulteriori informazioni, vedere Costruttori privati (Guida per programmatori C#).

I costruttori per i tipi struct sono simili ai costruttori di classi, con la differenza che i tipi structs non possono contenere un costruttore predefinito esplicito perché ne viene automaticamente fornito uno dal compilatore. Il costruttore inizializza ogni campo di struct in base ai valori predefiniti. Per ulteriori informazioni, vedere Tabella dei valori predefiniti (Riferimenti per C#). Questo costruttore predefinito viene tuttavia richiamato solo se viene creata un'istanza di struct con new. Nel codice seguente viene ad esempio utilizzato il costruttore predefinito per Int32, in modo da avere la certezza che venga inizializzato l'intero:

int i = new int();
Console.WriteLine(i);

Il codice seguente comporta tuttavia la generazione di un errore del compilatore in quanto non viene utilizzato l'oggetto new e in quanto viene eseguito un tentativo di utilizzare un oggetto non inizializzato.

int i;
Console.WriteLine(i);

In alternativa, gli oggetti basati su structs (inclusi tutti i tipi numerici incorporati) possono essere inizializzati o assegnati e quindi utilizzati, come illustrato 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);

In questo caso non è necessario chiamare il costruttore predefinito per ottenere un tipo di valore.

Sia le classi che gli oggetti structs possono definire costruttori che accettano parametri. I costruttori che accettano parametri devono essere chiamati tramite un'istruzione new o un'istruzione base. Le classi e gli oggetti structs possono inoltre definire più costruttori e non devono necessariamente definire un costruttore predefinito. Di seguito è riportato un esempio.

public class Employee
{
    public int salary;

    public Employee(int annualSalary)
    {
        salary = annualSalary;
    }

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        salary = weeklySalary * numberOfWeeks;
    }
}

Per creare questa classe, è possibile utilizzare una delle seguenti istruzioni:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Un costruttore può utilizzare la parola chiave base per chiamare il costruttore di una classe base. Di seguito è riportato un 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 dell'esecuzione del blocco per il costruttore. La parola chiave base può essere utilizzata con o senza parametri. Gli eventuali parametri del costruttore possono essere utilizzati come parametri per base oppure come parte di un'espressione. Per ulteriori informazioni, vedere base (Riferimenti per C#).

Se in una classe derivata non viene chiamato in modo esplicito il costruttore della classe di base mediante la parola chiave base, verrà chiamato in modo implicito l'eventuale costruttore predefinito disponibile. Le seguenti dichiarazioni di costruttori sono quindi in realtà identiche:

public Manager(int initialdata)
{
    //Add further instructions here.
}
public Manager(int initialdata)
    : base()
{
    //Add further instructions here.
}

Se una classe di base non include un costruttore predefinito, la classe derivata deve effettuare una chiamata esplicita a un costruttore di base utilizzando base.

Un costruttore può richiamare un altro costruttore nello stesso oggetto utilizzando la parola chiave this. Analogamente a base, è possibile utilizzare this con o senza parametri. Gli eventuali parametri del costruttore sono disponibili come parametri per this o come parte di un'espressione. È ad esempio possibile riscrivere il secondo costruttore dell'esempio precedente utilizzando la parola chiave this:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

Utilizzando la parola chiave this riportata nell'esempio precedente, verrà chiamato questo costruttore:

public Employee(int annualSalary)
{
    salary = annualSalary;
}

I costruttori possono essere contrassegnati come public, private, protected, internal o protected internal. Questi modificatori definiscono le modalità di costruzione della classe per gli utenti della classe. Per ulteriori informazioni, vedere Modificatori di accesso.

Un costruttore può essere dichiarato statico mediante la parola chiave static. I costruttori statici vengono chiamati automaticamente immediatamente prima dell'accesso a qualsiasi campo statico e vengono in genere utilizzati per inizializzare i membri di classi statiche. Per ulteriori informazioni, vedere Costruttori statici.

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Riferimenti

Classi e struct (Guida per programmatori C#)

Costruttori (Guida per programmatori C#)

Distruttori (Guida per programmatori C#)

Concetti

Guida per programmatori C#