Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Una classe statica è fondamentalmente uguale a una classe non statica , ma esiste una differenza: non è possibile creare un'istanza di una classe statica. In altre parole, non è possibile usare il nuovo operatore per creare una variabile del tipo di classe. Poiché non esiste alcuna variabile di istanza, è possibile accedere ai membri di una classe statica usando il nome della classe stessa. Ad esempio, se si dispone di una classe statica denominata UtilityClass
con un metodo statico pubblico denominato MethodA
, chiamare il metodo come illustrato nell'esempio seguente:
UtilityClass.MethodA();
Una classe statica può essere usata come contenitore pratico per set di metodi che funzionano solo sui parametri di input e non è necessario ottenere o impostare campi di istanza interni. Ad esempio, nella libreria di classi .NET la classe statica System.Math contiene metodi che eseguono operazioni matematiche, senza dover archiviare o recuperare dati univoci per una determinata istanza della Math classe . Vale a dire, si applicano i membri della classe specificando il nome della classe e il nome del metodo, come illustrato nell'esempio seguente.
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));
// Output:
// 3.14
// -4
// 3
Come accade con tutti i tipi di classe, il runtime .NET carica le informazioni sul tipo per una classe statica quando il programma che fa riferimento alla classe viene caricato. Il programma non può specificare esattamente quando viene caricata la classe. Tuttavia, è garantito che il caricamento, l'inizializzazione dei campi e la chiamata del costruttore statico della classe avvengano prima che si faccia riferimento alla classe stessa per la prima volta nel tuo programma. Un costruttore statico viene chiamato una sola volta e una classe statica rimane in memoria per la durata del dominio applicazione in cui risiede il programma.
Nota
Per creare una classe non statica che consenta la creazione di una sola istanza di se stessa, vedere Implementazione di Singleton in C#.
L'elenco seguente fornisce le funzionalità principali di una classe statica:
Contiene solo membri statici.
Non è possibile creare un'istanza.
È sigillato.
Non può contenere costruttori di istanza.
La creazione di una classe statica è quindi fondamentalmente identica alla creazione di una classe che contiene solo membri statici e un costruttore privato. Un costruttore privato impedisce l'istanza della classe. Il vantaggio dell'uso di una classe statica è che il compilatore può verificare che nessun membro dell'istanza venga aggiunto accidentalmente. Il compilatore garantisce che le istanze di questa classe non possano essere create.
Le classi statiche sono sigillate e pertanto non possono essere ereditate. Non possono ereditare da alcuna classe o interfaccia ad eccezione di Object. Le classi statiche non possono contenere un costruttore di istanza. Tuttavia, possono contenere un costruttore statico. Le classi non statiche devono inoltre definire un costruttore statico se la classe contiene membri statici che richiedono l'inizializzazione non semplice. Per ulteriori informazioni, vedere Costruttori Statici.
Esempio
Ecco un esempio di una classe statica che contiene due metodi che converte la temperatura da Celsius a Fahrenheit e da Fahrenheit a Celsius:
public static class TemperatureConverter
{
public static double CelsiusToFahrenheit(string temperatureCelsius)
{
// Convert argument to double for calculations.
double celsius = Double.Parse(temperatureCelsius);
// Convert Celsius to Fahrenheit.
double fahrenheit = (celsius * 9 / 5) + 32;
return fahrenheit;
}
public static double FahrenheitToCelsius(string temperatureFahrenheit)
{
// Convert argument to double for calculations.
double fahrenheit = Double.Parse(temperatureFahrenheit);
// Convert Fahrenheit to Celsius.
double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}
}
class TestTemperatureConverter
{
static void Main()
{
Console.WriteLine("Please select the convertor direction");
Console.WriteLine("1. From Celsius to Fahrenheit.");
Console.WriteLine("2. From Fahrenheit to Celsius.");
Console.Write(":");
string? selection = Console.ReadLine();
double F, C = 0;
switch (selection)
{
case "1":
Console.Write("Please enter the Celsius temperature: ");
F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine() ?? "0");
Console.WriteLine($"Temperature in Fahrenheit: {F:F2}");
break;
case "2":
Console.Write("Please enter the Fahrenheit temperature: ");
C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine() ?? "0");
Console.WriteLine($"Temperature in Celsius: {C:F2}");
break;
default:
Console.WriteLine("Please select a convertor.");
break;
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Example Output:
Please select the convertor direction
1. From Celsius to Fahrenheit.
2. From Fahrenheit to Celsius.
:2
Please enter the Fahrenheit temperature: 20
Temperature in Celsius: -6.67
Press any key to exit.
*/
Membri statici
Una classe non statica può contenere metodi statici, campi, proprietà o eventi. Il membro statico è chiamabile su una classe anche quando non esiste alcuna istanza della classe . Il membro statico è sempre accessibile dal nome della classe, non dal nome dell'istanza. Esiste una sola copia di un membro statico, indipendentemente dal numero di istanze della classe. I metodi e le proprietà statici non possono accedere a campi ed eventi non statici nel tipo contenitore e non possono accedere a una variabile di istanza di qualsiasi oggetto a meno che non venga passato in modo esplicito in un parametro del metodo.
È più tipico dichiarare una classe non statica con alcuni membri statici, piuttosto che dichiarare un'intera classe come statica. Due usi comuni dei campi statici sono per mantenere un conteggio del numero di oggetti di cui viene creata un'istanza o per archiviare un valore che deve essere condiviso tra tutte le istanze.
I metodi statici possono essere sovraccaricati ma non ridefiniti, perché appartengono alla classe e non a un'istanza della classe.
Anche se un campo non può essere dichiarato come static const
, un campo const è essenzialmente statico nel suo comportamento. Appartiene alla tipologia, non alle sue istanze. È pertanto possibile accedere const
campi usando la stessa notazione ClassName.MemberName
usata per i campi statici. Non è necessaria alcuna istanza oggetto.
C# non supporta variabili locali statiche, ovvero variabili dichiarate nell'ambito del metodo.
È possibile dichiarare membri di classe statici usando la parola chiave static
prima del tipo restituito del membro, come illustrato nell'esempio seguente:
public class Automobile
{
public static int NumberOfWheels = 4;
public static int SizeOfGasTank
{
get
{
return 15;
}
}
public static void Drive() { }
public static event EventType? RunOutOfGas;
// Other non-static fields and properties...
}
I membri statici vengono inizializzati prima che il membro statico venga accesso per la prima volta e prima che il costruttore statico, se presente, venga chiamato. Per accedere a un membro di classe statico, usare il nome della classe anziché un nome di variabile per specificare il percorso del membro, come illustrato nell'esempio seguente:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
Se la classe contiene campi statici, specificare un costruttore statico che li inizializza quando viene caricata la classe.
Una chiamata a un metodo statico genera un'istruzione di chiamata in common intermediate language (CIL), mentre una chiamata a un metodo di istanza genera un'istruzione callvirt
, che controlla anche la presenza di riferimenti a oggetti Null. Tuttavia, la maggior parte del tempo la differenza di prestazioni tra i due non è significativa.
Specifiche del linguaggio C#
Per altre informazioni, vedere Classi statiche, membri di istanza ecostruttori statici nella specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.