This article has been localized into Italian by the community.
Membri statici
Come abbiamo visto nel capitolo precedente, il metodo solito per comunicare con una classe è di crearne una nuova istanza e quindi lavorrare sull'oggetto risultante. In molti casi, questo è tutto ciò che sono le classi; l'abilità di istanziare più copie della stessa classe e poi usarle in modi diversi. Comunque, in alcuni casi, potresti volere una classe che puoi usare senza istanziarla, o almeno una classe di cui puoi usare membri senza dover creare l'oggetto. Per esempio, potresti avere una classe con una variabile che resta sempre la stessa, indipendentemente da dove e come la si usi. Questo è chiamato membro statico, perché resta sempre lo stesso.
Una classe può essere statica e può avere membri statici, sia funzioni che campi. Una classe statica non può essere istanziata, quindi in altre parole, funzionerà più come un aggregato di membri che come una classe reale. Potresti invece decidere di creare una classe non statica, ma lasciare che abbia alcuni membri statici. Una classe non statica può essere istanziata ed usata come una classe regolare, ma non puoi usare un membro statico su un oggetto della classe. Una classe statica può solo contenere membri statici.
Ecco un esempio di classe statica:
public static class Rectangle
{
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Come puoi vedere, usiamo la parola chiave static per marcare la classe come statica e poi la usiamo di nuovo per marcare il metodo CalculateArea come statico. Se non l'avessimo fatto, il compilatore si sarebbe lamentato, poiché non possiamo avere un membro non statico in una classe statica.
Per usare questo metodo, lo chiamiamo direttamente sulla classe, in questo modo:
Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));
Potremmo aggiungere altri metodi utili alla classe Rectangle, ma forse ti stai chiedendo perché stiamo passando i parametri width ed height al metodo invece di memorizzarli all'interno della classe e poi prenderli da lì quando ci servono? Perché è statica! Potremmo memorizzarli, ma solo un set di dimensioni, perché c'è una sola versione di una classe statica. Questo è molto importante da capire.
Invece possiamo rendere la classe non statica e quindi lasciare CalculateArea come una funzione di servizio su questa classe:
public class Rectangle
{
private int width, height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public void OutputArea()
{
Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
}
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Come puoi vedere, abbiamo reso la classe non statica. Abbiamo anche aggiunto un costruttore, che prende una larghezza ed un'altezza e le assegna all'istanza. Poi abbiamo aggiunto un metodo OutputArea, che usa il metodo statico per calcolare l'area. Questo è un pratico esempio di come combinare membri statici con membri non statici in una classe non statica.
Un uso comune delle classi statiche, sebbene biasimato da molte persone, sono le classi utility/helper, dove si raccolgono molti metodi utili, che potrebbero non appartenervi, ma che non sembrano appartenere neanche ad altre parti.