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
Riferimenti
Modificatori (Riferimenti per C#)
Classi statiche e membri di classi statiche (Guida per programmatori C#)