Utilizzo di costruttori (Guida per programmatori C#)Using Constructors (C# Programming Guide)

Quando si crea una classe o uno struct viene chiamato il relativo costruttore.When a class or struct is created, its constructor is called. I costruttori hanno lo stesso nome della classe o dello struct e in genere inizializzano i membri dati del nuovo oggetto.Constructors have the same name as the class or struct, and they usually initialize the data members of the new object.

Nell'esempio seguente viene definita una classe denominata Taxi usando un costruttore semplice.In the following example, a class named Taxi is defined by using a simple constructor. Viene quindi creata un'istanza per la classe con l'operatore new.This class is then instantiated with the new operator. Il costruttore Taxi viene richiamato dall'operatore new immediatamente dopo l'allocazione della memoria per il nuovo oggetto.The Taxi constructor is invoked by the new operator immediately after memory is allocated for the new object.

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 è detto costruttore predefinito.A constructor that takes no parameters is called a default constructor. I costruttori predefiniti vengono richiamati ogni volta che si crea un'istanza per un oggetto usando l'operatore new e non sono specificati argomenti per new.Default constructors are invoked whenever an object is instantiated by using the new operator and no arguments are provided to new. Per altre informazioni, vedere Costruttori di istanze.For more information, see Instance Constructors.

A meno che la classe sia statica, le classi senza costruttori ricevono un costruttore predefinito pubblico dal compilatore C# per consentire la creazione di istanze di classi.Unless the class is static, classes without constructors are given a public default constructor by the C# compiler in order to enable class instantiation. Per altre informazioni, vedere Classi statiche e membri di classi statiche.For more information, see Static Classes and Static Class Members.

È possibile impedire che venga creata un'istanza per una classe rendendo il costruttore privato, come indicato di seguito:You can prevent a class from being instantiated by making the constructor private, as follows:

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

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

Per altre informazioni, vedere Costruttori privati.For more information, see Private Constructors.

I costruttori per i tipi struct sono simili ai costruttori di classi, ma gli structs non possono contenere un costruttore predefinito esplicito poiché ne viene specificato automaticamente uno dal compilatore.Constructors for struct types resemble class constructors, but structs cannot contain an explicit default constructor because one is provided automatically by the compiler. Questo costruttore inizializza ogni campo dello struct sui valori predefiniti.This constructor initializes each field in the struct to the default values. Per altre informazioni, vedere Tabella dei valori predefiniti.For more information, see Default Values Table. Il costruttore predefinito viene tuttavia richiamato solo se si crea un'istanza per lo struct con new.However, this default constructor is only invoked if the struct is instantiated with new. Ad esempio, questo codice usa il costruttore predefinito per Int32, in modo da garantire che venga inizializzato l'Integer:For example, this code uses the default constructor for Int32, so that you are assured that the integer is initialized:

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

Il codice seguente, tuttavia, provoca un errore del compilatore perché non usa new e poiché tenta di usare un oggetto che non è stato inizializzato:The following code, however, causes a compiler error because it does not use new, and because it tries to use an object that has not been initialized:

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 usati come nell'esempio seguente:Alternatively, objects based on structs (including all built-in numeric types) can be initialized or assigned and then used as in the following example:

int a = 44;  // Initialize the value type...  
int b;  
b = 33;      // Or assign it before using it.  
Console.WriteLine("{0}, {1}", a, b);  

Quindi la chiamata al costruttore predefinito per un tipo di valore non è necessaria.So calling the default constructor for a value type is not required.

Sia le classi che gli structs possono definire costruttori che accettano parametri.Both classes and structs can define constructors that take parameters. I costruttori che accettano parametri devono essere chiamati con un'istruzione new o un'istruzione di base.Constructors that take parameters must be called through a new statement or a base statement. Le classi e gli structs possono inoltre definire più costruttori e non è necessario definire un costruttore predefinito.Classes and structs can also define multiple constructors, and neither is required to define a default constructor. Ad esempio:For example:

public class Employee
{
    public int salary;

    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:This class can be created by using either of the following statements:

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 di base.A constructor can use the base keyword to call the constructor of a base class. Ad esempio:For example:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

In questo esempio il costruttore per la classe di base viene chiamato prima che venga eseguito il blocco per il costruttore.In this example, the constructor for the base class is called before the block for the constructor is executed. La parola chiave base può essere usata con o senza parametri.The base keyword can be used with or without parameters. Tutti i parametri per il costruttore possono essere usati come parametri per base o come parte di un'espressione.Any parameters to the constructor can be used as parameters to base, or as part of an expression. Per altre informazioni, vedere base.For more information, see base.

In una classe derivata, se un costruttore di classe base non viene chiamato in modo esplicito usando la parola chiave base, il costruttore predefinito, se ne esiste uno, viene chiamato in modo implicito.In a derived class, if a base-class constructor is not called explicitly by using the base keyword, the default constructor, if there is one, is called implicitly. Ciò significa quindi che le seguenti dichiarazioni del costruttore si equivalgono:This means that the following constructor declarations are effectively the same:

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

Se una classe di base non offre un costruttore predefinito, la classe derivata deve effettuare una chiamata esplicita a un costruttore di base usando base.If a base class does not offer a default constructor, the derived class must make an explicit call to a base constructor by using base.

Un costruttore può richiamare un altro costruttore nello stesso oggetto usando la parola chiave this.A constructor can invoke another constructor in the same object by using the this keyword. Come base, this può essere utilizzata con o senza parametri e gli eventuali parametri nel costruttore sono disponibili come parametri per this o come parte di un'espressione.Like base, this can be used with or without parameters, and any parameters in the constructor are available as parameters to this, or as part of an expression. Ad esempio, il secondo costruttore nell'esempio precedente può essere riscritto usando this:For example, the second constructor in the previous example can be rewritten using this:

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

L'uso della parola chiave this nell'esempio precedente causa la chiamata di questo costruttore:The use of the this keyword in the previous example causes this constructor to be called:

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

I costruttori possono essere contrassegnati come public, private, protected, internal, protected internal o private protected.Constructors can be marked as public, private, protected, internal, protected internal or private protected. Questi modificatori di accesso definiscono il modo in cui gli utenti della classe possono costruire la classe.These access modifiers define how users of the class can construct the class. Per altre informazioni, vedere Access Modifiers (Modificatori di accesso).For more information, see Access Modifiers.

Un costruttore può essere dichiarato statico usando la parola chiave static.A constructor can be declared static by using the static keyword. I costruttori statici vengono chiamati automaticamente subito prima dell'accesso ai campi statici e in genere vengono usati per inizializzare i membri delle classi statiche.Static constructors are called automatically, immediately before any static fields are accessed, and are generally used to initialize static class members. Per altre informazioni, vedere Costruttori statici.For more information, see Static Constructors.

Specifiche del linguaggio C#C# Language Specification

Per altre informazioni, vedere Costruttori di istanze e Costruttori statici in Specifica del linguaggio C#.For more information, see Instance constructors and Static constructors in the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee Also