Condividi tramite


static (Riferimenti per C#)

Aggiornamento: novembre 2007

Utilizzare il modificatore static per dichiarare un membro statico che appartiene al tipo stesso anziché a un oggetto specifico. Il modificatore static può essere utilizzato con classi, campi, metodi, proprietà, operatori, eventi e costruttori, ma non con indicizzatori, distruttori o tipi che non sono classi. Per ulteriori informazioni, vedere la classe Classi statiche e membri di classi statiche (Guida per programmatori C#).

Esempio

La classe seguente viene dichiarata come static e contiene soltanto metodi static:

static class CompanyEmployee
{
    public static void DoSomething() { /*...*/ }
    public static void DoSomethingElse() { /*...*/  }
}

Una dichiarazione di costanti o di tipi è in modo implicito un membro static.

Non è possibile fare riferimento a un membro static mediante un'istanza. È invece possibile ottenere il risultato desiderato utilizzando il nome del tipo in cui è dichiarato. Si consideri ad esempio la seguente classe:

public class MyBaseC
{
    public struct MyStruct
    {
        public static int x = 100;
    }
}

Per fare riferimento al membro static x, utilizzare il nome completo, a meno che non sia accessibile dallo stesso ambito:

MyBaseC.MyStruct.x

Mentre l'istanza di una classe contiene una copia distinta di tutti i campi di istanza della classe, esiste una sola copia per ciascun campo static.

Non è possibile utilizzare this per fare riferimento a metodi statici o a funzioni di accesso della proprietà statiche.

Se la parola chiave static viene applicata a una classe, tutti i membri della classe devono essere statici.

Le classi e le classi statiche potrebbero avere costruttori statici. I costruttori statici vengono chiamati in un determinato momento compreso tra l'avvio del programma e la creazione di un'istanza della classe.

Nota:

La parola chiave static ha un utilizzo limitato rispetto a C++. Per un confronto con la corrispondente parola chiave di C++, vedere Static (C++).

Per illustrare le caratteristiche dei membri statici, si consideri una classe che rappresenta un dipendente di un'azienda. Si supponga che la classe contenga un metodo per conteggiare i dipendenti e un campo per archiviarne il numero. Sia il metodo che il campo non appartengono ad alcuna istanza di tipo dipendente, in quanto appartengono alla classe azienda e devono pertanto essere dichiarati come membri static della classe.

In questo esempio si leggono il nome e l'identificatore di un nuovo dipendente; il contatore di dipendenti viene quindi incrementato di un'unità e vengono visualizzate le informazioni relative al nuovo dipendente e al numero di dipendenti aggiornato. Per semplicità, questo programma legge il numero attuale di dipendenti dalla tastiera. In un'applicazione reale, queste informazioni verrebbero lette da un file.

    public class Employee4
{
    public string id;
    public string name;

    public Employee4()
    {
    }

    public Employee4(string name, string id)
    {
        this.name = name;
        this.id = id;
    }

    public static int employeeCounter;

    public static int AddEmployee()
    {
        return ++employeeCounter;
    }
}

class MainClass : Employee4
{
    static void Main()
    {
        Console.Write("Enter the employee's name: ");
        string name = Console.ReadLine();
        Console.Write("Enter the employee's ID: ");
        string id = Console.ReadLine();

        // Create and configure the employee object:
        Employee4 e = new Employee4(name, id);
        Console.Write("Enter the current number of employees: ");
        string n = Console.ReadLine();
        Employee4.employeeCounter = Int32.Parse(n);
        Employee4.AddEmployee();

        // Display the new information:
        Console.WriteLine("Name: {0}", e.name);
        Console.WriteLine("ID:   {0}", e.id);
        Console.WriteLine("New Number of Employees: {0}",
                      Employee4.employeeCounter);
    }
}
    /*
    Input:
    Matthias Berndt
    AF643G
    15
    Sample Output:
    Enter the employee's name: Matthias Berndt
    Enter the employee's ID: AF643G
    Enter the current number of employees: 15
    Name: Matthias Berndt
    ID:   AF643G
    New Number of Employees: 16
    */

In questo esempio viene mostrato che, sebbene sia possibile inizializzare un campo statico tramite un altro campo statico non ancora dichiarato, i risultati non saranno definiti finché non verrà assegnato un valore al campo statico in modo esplicito.

class Test
{
   static int x = y;
   static int y = 5;

   static void Main()
   {
      Console.WriteLine(Test.x);
      Console.WriteLine(Test.y);

      Test.x = 99;
      Console.WriteLine(Test.x);
   }
}
/*
Output:
    0
    5
    99
*/

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 1.6.6.3 Metodi statici e di istanza

  • 5.1.1 Variabili statiche

  • 10.3.7 Membri statici e di istanza

  • 10.5.1 Campi statici e di istanza

  • 10.5.5.1 Inizializzazione di campi statici

  • 10.6.2 Metodi statici e di istanza

  • 10.7.1 Proprietà statiche e di istanza

  • 10.8.3 Eventi statici e di istanza

  • 10.12 Costruttori statici

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Parole chiave di C#

Modificatori (Riferimenti per C#)

Classi statiche e membri di classi statiche (Guida per programmatori C#)

Altre risorse

Riferimenti per C#