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 Costruttori Using.

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 dei campi del tipo di base vengono eseguiti. Inizializzatori di campo che iniziano con la base diretta tramite ogni tipo di base a System.Object.
  4. I costruttori dell'istanza di base vengono eseguiti. Qualsiasi costruttore di istanza, a partire da Object.Object ogni classe di base alla classe base diretta.
  5. Viene eseguito il costruttore dell'istanza. 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 viene struct impostata sul relativo default valore, 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 fornisce un costruttore statico per inizializzare i campi statici, il compilatore C# inizializza i campi statici sul 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