Condividi tramite


Costruttori statici (Guida per programmatori C#)

Aggiornamento: Luglio 2008

Un costruttore statico consente di inizializzare gli eventuali dati statici oppure di eseguire un'operazione specifica che deve essere effettuata una sola volta. Viene chiamato automaticamente prima che ne venga creata la prima istanza o venga fatto riferimento a qualsiasi membro statico.

class SimpleClass
{
    // Static variable that must be initialized at run time.
    static readonly long baseline;

    // Static constructor is called at most one time, before any
    // instance constructor is invoked or member is accessed.
    static SimpleClass()
    {
        baseline = DateTime.Now.Ticks;
    }
}

Di seguito sono riportate le proprietà dei costruttori statici:

  • Un costruttore statico non accetta modificatori di accesso né parametri.

  • Un costruttore statico viene chiamato automaticamente per inizializzare la classe prima che ne venga creata la prima istanza o venga fatto riferimento a qualsiasi membro statico.

  • Un costruttore statico non può essere chiamato direttamente.

  • L'utente non può controllare in alcun modo il momento in cui il costruttore statico viene eseguito nel programma.

  • In genere, i costruttori statici sono utilizzati per scrivere voci nel file di log, quando alla classe è associato un file di log.

  • I costruttori statici risultano utili anche durante la creazione di classi wrapper per il codice non gestito, quando il costruttore può chiamare il metodo LoadLibrary.

  • Se un costruttore statico genera un'eccezione, il runtime non lo richiamerà una seconda volta e il tipo rimarrà non inizializzato per la durata del dominio dell'applicazione in cui il programma è in esecuzione.

Esempio

Nell'esempio seguente la classe Bus dispone di un costruttore statico e di un membro statico, Drive(). Quando Drive() viene chiamato, il costruttore statico viene richiamato per inizializzare la classe.

 public class Bus
 {
     // static variable used by all Bus instances
     // Represents the time the first bus of the day starts its route.
     protected static readonly DateTime globalStartTime;

     // Instance readonly variable
     protected int RouteNumber { get; set; }

     // Static constructor to initialize static variable.
     // It is invoked before the first instance constructor is called.
     static Bus()
     {
         globalStartTime = DateTime.Now;
         Console.WriteLine("Static ctor sets global start time to {0}", globalStartTime.ToLongTimeString());
     }

     // Instance constructor
     public Bus(int routeNum)
     {
         RouteNumber = routeNum;
         Console.WriteLine("{0} is created.", RouteNumber);
     }

     // Instance method.
     public void Drive()
     {
         TimeSpan elapsedTime = DateTime.Now - globalStartTime;

         // For demonstration purposes we treat milliseconds as minutes to 
         // simulate actual bus times. Do not do this in your actual bus schedule program!
         Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}.",
                                 this.RouteNumber,
                                 elapsedTime.TotalMilliseconds,
                                 globalStartTime.ToShortTimeString());
     }
 }

 class TestBus
 {
     static void Main()
     {

         Bus bus = new Bus(71);
         bus.Drive();

         // Wait for next bus to warm up.
         System.Threading.Thread.Sleep(25);

         Bus bus2 = new Bus(72);
         bus2.Drive();


         // Keep the console window open in debug mode.
         System.Console.WriteLine("Press any key to exit.");
         System.Console.ReadKey();
     }
 }
 /* Output:
     Static ctor sets global start time to 10:04:08 AM
     71 is created.
     71 is starting its route 21.00 minutes after global start time 10:04 AM.
     72 is created.
     72 is starting its route 46.00 minutes after global start time 10:04 AM.      
*/


Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Classi e strutture (Guida per programmatori C#)

Costruttori (Guida per programmatori C#)

Distruttori (Guida per programmatori C#)

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Aggiunto punto elenco in eccezioni del costruttore statico.

Correzione di errori nel contenuto.