Condividi tramite


Costruttori (Guida per programmatori C#)

Ogni volta che viene creata un'istanza di una classe o di uno struct, viene chiamato il relativo costruttore. Una classe o uno struct può avere più costruttori che accettano argomenti diversi. I costruttori consentono al programmatore di impostare i valori predefiniti, limitare la creazione di istanze e scrivere codice flessibile e facile da leggere. Per altre informazioni ed esempi, vedere Costruttori di istanze e Uso dei costruttori.

Esistono diverse azioni che fanno parte dell'inizializzazione di una nuova istanza. Tali azioni si svolgono nell'ordine seguente:

  1. I campi dell'istanza sono impostati su 0. Questa operazione viene in genere eseguita dal runtime.
  2. Gli inizializzatori di campo vengono eseguiti. Inizializzatori di campo nell'esecuzione del tipo più derivato.
  3. Gli inizializzatori di campi del tipo di base vengono eseguiti. Inizializzatori di campo statici che iniziano con la base diretta tramite ogni tipo di base a System.Object.
  4. Costruttori dell'istanza di base vengono eseguiti. Tutti i costruttori di istanze, a partire da Object.Object tramite ogni classe di base alla classe di base diretta.
  5. Il costruttore dell'istanza viene eseguito. Viene eseguito il costruttore dell'istanza per il tipo.
  6. Gli inizializzatori di oggetti vengono eseguiti. Se l'espressione include gli inizializzatori di oggetto, questi vengono eseguiti dopo l'esecuzione del costruttore dell'istanza. Gli inizializzatori di oggetti vengono eseguiti nell'ordine testuale.

Le azioni precedenti vengono eseguite quando viene inizializzata una nuova istanza. Se una nuova istanza di un struct è impostata sul valore default, tutti i campi dell'istanza vengono impostati su 0.

Se il costruttore statico non è stato eseguito, il costruttore statico viene eseguito prima che venga eseguita una qualsiasi delle azioni del costruttore dell'istanza.

Sintassi del costruttore

Un costruttore è un metodo il cui nome è identico al nome del tipo relativo. La firma del metodo include solo un modificatore di accesso facoltativo, il nome del metodo e il relativo elenco di parametri; non include un tipo restituito. L'esempio seguente illustra il costruttore di una classe denominata Person.

public class Person
{
   private string last;
   private string first;

   public Person(string lastName, string firstName)
   {
      last = lastName;
      first = firstName;
   }

   // Remaining implementation of Person class.
}

Se un costruttore può essere implementato come istruzione unica, è possibile usare una definizione del corpo dell'espressione. L'esempio seguente definisce una classe Location il cui costruttore ha un solo parametro di stringa denominato name. La definizione del corpo dell'espressione assegna l'argomento al campo locationName.

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

Costruttori statici

Tutti gli esempi precedenti hanno illustrato costruttori di istanza, che creano un nuovo oggetto. Una classe o uno struct può avere anche un costruttore statico, che inizializza i membri statici del tipo. I costruttori statici non hanno parametri. Se non si specifica un costruttore statico per inizializzare campi statici, il compilatore C# inizializza i campi statici sul relativo valore predefinito come indicato nell'articolo Valori predefiniti dei tipi C#.

L'esempio seguente usa un costruttore statico per inizializzare un campo statico.

public class Adult : Person
{
   private static int minimumAge;

   public Adult(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Adult()
   {
      minimumAge = 18;
   }

   // Remaining implementation of Adult class.
}

È anche possibile definire un costruttore statico con una definizione di corpo dell'espressione, come illustrato nell'esempio seguente.

public class Child : Person
{
   private static int maximumAge;

   public Child(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Child() => maximumAge = 18;

   // Remaining implementation of Child class.
}

Per altre informazioni, vedere Costruttori statici.

In questa sezione

Vedi anche