This article has been localized into Italian by the community.
Costanti (la parola chiave const)
Fino ad ora abbiamo affrontato un sacco di variabili e, come il nome suggerisce, variabili possono essere sempre cambiare. L'opposto delle variabili sono le costanti, introdotte in C# con la parola chiave const. Quando si dichiara una costante bisogna assegnarle immediatamente un valore, dopodiche NON si possono effettuare cambiamenti al suo valore. Questo è ottimo quando hai valori che non cambiano mai, e vuoi essere sicuro che non vengano manipolati dal tuo codice, nemmeno accidentalmente.
Troverai molte costanti in framework, per esempio la classe Math, dove la costante PI è definita:
Console.WriteLine(Math.PI);
Naturalmente la parte interessante sta nel dichiarare le costanti. La costante puo essere definita come campo di un metodo, per esempio:
static void Main(string[] args)
{
const int TheAnswerToLife = 42;
Console.WriteLine("The answer to life, the universe and everything: " + TheAnswerToLife);
}
Tuttavia, molte costanti sono dichiarate nelle classi, in modo che siano accessibili ( ma non cambiabili, naturalmente) da tutti i metodi della classe e persino al di fuori della classe, dipendentemente dalla visibilità. Una costante agirà come un membro statico della classe, cioè è possibile accedervi senza che la classe sia istanziata. Adesso proviamo un esempio dove due costanti sono definite - una costante pubblica ed una privata:
using System;
namespace Constants
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The fake answer to life: " + SomeClass.TheFakeAnswerToLife);
Console.WriteLine("The real answer to life: " + SomeClass.GetAnswer());
}
}
class SomeClass
{
private const int TheAnswerToLife = 42;
public const int TheFakeAnswerToLife = 43;
public static int GetAnswer()
{
return TheAnswerToLife;
}
}
}
Adesso nota come ho definito la classe (SomeClass) con due costanti. La prima è privata, quindi è accessibile solo dalla classe stessa mentre l'altra è pubblica. Quindi, nel nostri codice principale, accedo alle due costanti in maniera differente - prima direttamente, dato chè la risposta finta è pubblica, secondariamente con l'aiuto del metodo GetAnswer().
Che tipi possono essere usati come costanti?
Dato che le costanti devono essere dichiarate immediatamente e non possono essere cambiate secondariamente, il valore che assegni a una costante deve essere un espressione costante che il compilatore possa valutare immediatamente al momento della compilazione. Questo significa che numeri, valori boolean (Vero o Falso) e stringhe funzionerebbero perfettamente come costanti, mentre per esempio oggetti DateTime non possono essere utilizzati.
Dato che il compilatore ha bisogno di sapere immediatamente il valore della costante, ciò impone delle limitazioni sul cosa si può fate mentre si imposta il valore. Per esempio, questi sono i perfetti esempi di cosa PUOI fare:
const int a = 10;
const float b = a * 2.5f;
const string s1 = "Hello, world!";
const string s2 = s1 + " How are you?";
D'altro canto, non puoi utilizzare il risultato di una chiamata ad un metodo o il membro di una classe che non sia stato dichiarato con la parola chiave "const", poiché queste non sono espressioni costanti. Ecco un paio di altri esempi di cosa NON puoi fare:
// NOT possible:
const int a = Math.Cos(4) * 2;
// Possible:
const string s1 = "Hello, world!";
// NOT possible:
const string s2 = s1.Substring(0, 6) + " Universe";
La differenza sta in cosa il compilatore si aspetta di sapere nel momento in cui raggiunge il codice, esempio: Numeri, stringhe e altre costanti, in contrasto su cosa deve eseguire per prenderne il valore.
Un alternativa alle costanti: il campo di sola lettura
Se stai cercando un alternativa leggermente meno restrittiva rispetto alle costanti, potresti voler dare uno sguardo alla parola chiave readonly (Solo lettura). Non è disponibile a livello di metodo, ma può essere usata a livello di classe, per definire un campo che può essere modificato solo durante la dichiarazione o l'esecuzione del metodo costruttore della classe. Quindi, appena l'oggetto è disponibile per l'utilizzo, il campo readonly (Solo lettura) avrà lo stesso valore per sempre senza poter essere modificato dall'utente. Proviamolo:
class SomeClass
{
private readonly DateTime rightNow;
public readonly DateTime later = DateTime.Now.AddHours(2);
public SomeClass()
{
this.rightNow = DateTime.Now;
}
}
Quindi abbiamo due campi in sola lettura: Il primo privato, il secondo pubblico ( Solitamente abbiamo proprietà per questo, ma sopportatemi per il momento). Il primo viene dichiarato senza valore (Possiamo farlo con il campo in sola lettura, al contrario delle costanti), mentre il secondo viene inizializzato immediatamente. Noterai anche che stiamo usando la classe DateTime come tipo di dati, e assegnamo un valore di tipo non costante ad essa. In altre parole, abbiamo un sacco di cose che non possiamo fare con le costanti, creare campi in sola lettura è una buona alternativa alle costanti.
Nota come ho assegnato il valore al campo rightNow nel costruttore della classe SomeClass. Come già menzionato, questa è l'ultima possibilità di assegnare il valore a un campo in sola lettura. Dopodiche ogni qualvolta che provi ad assegnarle un valore, sia all'interno del metodo dentro la classe definita che al difuori, si riceverà un messaggio di errore dal compilatore.
Sommario
Una costante può essere definita dentro un metodo e a livello della classe. Ti permette di definire un valore già conosciuto al tempo di compilazione che non può essere cambiato più tardi. Tipicamente i tipi utilizzati per le costanti sono Interi, floats, stringhe e booleans (Vero o Falso). Se stai cercando più flessibilità, prova il campo di solo lettura (readonly), descritto al di sopra.