static (Riferimenti per C#)static (C# Reference)

In questa pagina viene illustrata la static parola chiave Modifier.This page covers the static modifier keyword. La static parola chiave fa anche parte della using static direttiva.The static keyword is also part of the using static directive.

Usare il modificatore static per dichiarare un membro statico, che appartiene allo stesso tipo invece che a un oggetto specifico.Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. Il static modificatore può essere usato per dichiarare static le classi.The static modifier can be used to declare static classes. In classi, interfacce e struct è possibile aggiungere il static modificatore a campi, metodi, proprietà, operatori, eventi e costruttori.In classes, interfaces, and structs, you may add the static modifier to fields, methods, properties, operators, events, and constructors. Il static modificatore non può essere usato con indicizzatori o finalizzatori.The static modifier can't be used with indexers or finalizers. Per altre informazioni, vedere classi statiche e membri di classi statiche.For more information, see Static Classes and Static Class Members.

A partire da C# 8,0, è possibile aggiungere il static modificatore a una funzione locale.Beginning with C# 8.0, you can add the static modifier to a local function. Una funzione locale statica non può acquisire le variabili locali o lo stato dell'istanza.A static local function can't capture local variables or instance state.

A partire da C# 9,0, è possibile aggiungere il static modificatore a un' espressione lambda o a un metodo anonimo.Beginning with C# 9.0, you can add the static modifier to a lambda expression or anonymous method. Un metodo lambda statico o anonimo non può acquisire le variabili locali o lo stato dell'istanza.A static lambda or anonymous method can't capture local variables or instance state.

Esempio-classe staticaExample - static class

La classe seguente viene dichiarata come static e contiene solo metodi static:The following class is declared as static and contains only static methods:

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

Una costante o una dichiarazione di tipo è implicitamente un static membro.A constant or type declaration is implicitly a static member. staticNon è possibile fare riferimento A un membro tramite un'istanza.A static member can't be referenced through an instance. Al contrario, viene fatto riferimento tramite il nome del tipo.Instead, it's referenced through the type name. Si consideri ad esempio la classe seguente:For example, consider the following class:

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

Per fare riferimento al static membro x , usare il nome completo, MyBaseC.MyStruct.x , a meno che il membro non sia accessibile dallo stesso ambito:To refer to the static member x, use the fully qualified name, MyBaseC.MyStruct.x, unless the member is accessible from the same scope:

Console.WriteLine(MyBaseC.MyStruct.x);

Mentre un'istanza di una classe contiene una copia separata di tutti i campi di istanza della classe, è presente una sola copia di ogni static campo.While an instance of a class contains a separate copy of all instance fields of the class, there's only one copy of each static field.

Non è possibile usare this per fare riferimento a static metodi o funzioni di accesso alle proprietà.It isn't possible to use this to reference static methods or property accessors.

Se la static parola chiave viene applicata a una classe, tutti i membri della classe devono essere static .If the static keyword is applied to a class, all the members of the class must be static.

Classi, interfacce e static classi possono avere static costruttori.Classes, interfaces, and static classes may have static constructors. Un static costruttore viene chiamato in un determinato punto tra l'avvio del programma e la creazione di un'istanza della classe.A static constructor is called at some point between when the program starts and the class is instantiated.

Nota

La parola chiave static ha un uso più limitato rispetto a C++.The static keyword has more limited uses than in C++. Per un confronto con la parola chiave di C++, vedere Classi di archiviazione (C++).To compare with the C++ keyword, see Storage classes (C++).

Per illustrare static i membri, si consideri una classe che rappresenta un dipendente della società.To demonstrate static members, consider a class that represents a company employee. Si supponga che la classe contenga un metodo di conteggio dei dipendenti e un campo per memorizzare il numero dei dipendenti.Assume that the class contains a method to count employees and a field to store the number of employees. Sia il metodo che il campo non appartengono ad alcuna istanza di un dipendente.Both the method and the field don't belong to any one employee instance. Appartengono invece alla classe di dipendenti nel suo complesso.Instead, they belong to the class of employees as a whole. Devono essere dichiarati come static membri della classe.They should be declared as static members of the class.

Esempio-campo statico e metodoExample - static field and method

Questo esempio legge il nome e l'ID di un nuovo dipendente, il contatore dipendente viene incrementato di uno e vengono visualizzate le informazioni per il nuovo dipendente e il nuovo numero di dipendenti.This example reads the name and ID of a new employee, increments the employee counter by one, and displays the information for the new employee and the new number of employees. Questo programma legge il numero corrente di dipendenti dalla tastiera.This program reads the current number of employees from the keyboard.

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: {e.name}");
        Console.WriteLine($"ID:   {e.id}");
        Console.WriteLine($"New Number of Employees: {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
*/

Esempio-inizializzazione staticaExample - static initialization

Questo esempio mostra che è possibile inizializzare un static campo usando un altro static campo non ancora dichiarato.This example shows that you can initialize a static field by using another static field that is not yet declared. I risultati non saranno definiti fino a quando non si assegna in modo esplicito un valore al static campo.The results will be undefined until you explicitly assign a value to the static field.

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#C# language specification

Per ulteriori informazioni, vedere la specifica del linguaggio C#.For more information, see the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also