C# Language const


Esempio

const è usato per rappresentare valori che non cambieranno mai per tutta la durata del programma. Il suo valore è costante dalla fase di compilazione , a differenza della parola chiave readonly , il cui valore è costante dal tempo di esecuzione.

Ad esempio, poiché la velocità della luce non cambierà mai, possiamo memorizzarla in una costante.

const double c = 299792458;  // Speed of light

double CalculateEnergy(double mass)
{
    return mass * c * c;
}

Questo è essenzialmente uguale alla return mass * 299792458 * 299792458 , in quanto il compilatore sostituirà direttamente c con il suo valore costante.

Di conseguenza, c non può essere modificato una volta dichiarato. Quanto segue produrrà un errore in fase di compilazione:

const double c = 299792458;  // Speed of light 

c = 500;  //compile-time error

Una costante può essere preceduta dagli stessi modificatori di accesso dei metodi:

private const double c = 299792458;
public const double c = 299792458;
internal const double c = 299792458;

const membri const sono static per natura. Tuttavia, l'uso static esplicito non è permesso.

È inoltre possibile definire le costanti del metodo locale:

double CalculateEnergy(double mass)
{
    const c = 299792458;
    return mass * c * c;
}

Questi non possono essere preceduti da una parola chiave private o public , poiché sono implicitamente locali rispetto al metodo in cui sono definiti.


Non tutti i tipi possono essere utilizzati in una dichiarazione const . I tipi di valori consentiti sono i tipi predefiniti sbyte , byte , short , ushort , int , uint , long , ulong , char , float , double , decimal , bool e tutti i tipi enum . Provare a dichiarare membri const con altri tipi di valore (come TimeSpan o Guid ) fallirà in fase di compilazione.

Per la speciale string tipo di riferimento predefinita, le costanti possono essere dichiarate con qualsiasi valore. Per tutti gli altri tipi di riferimento, le costanti possono essere dichiarate ma devono sempre avere il valore null .


Poiché i valori const sono noti in fase di compilazione, sono consentiti come etichette case in un'istruzione switch , come argomenti standard per parametri facoltativi, come argomenti per l'attribuzione di specifiche e così via.


Se i valori const vengono utilizzati tra diversi assembly, è necessario prestare attenzione con il controllo delle versioni. Ad esempio, se l'assembly A definisce un public const int MaxRetries = 3; e l'assembly B usa quella costante, quindi se il valore di MaxRetries viene in seguito modificato in 5 nell'assembly A (che viene quindi ricompilato), tale modifica non sarà effettiva nell'assembly B a meno che l' assembly B non venga ricompilato (con un riferimento alla nuova versione di A).

Per questo motivo, se un valore può cambiare nelle revisioni future del programma e se il valore deve essere visibile pubblicamente, non dichiarare tale valore const se non si è certi che tutti gli assembly dipendenti verranno ricompilati ogni volta che qualcosa viene modificato. L'alternativa sta usando static readonly invece di const , che viene risolto in fase di runtime.