C# Language const


Exemple

const est utilisé pour représenter des valeurs qui ne changeront jamais pendant la durée de vie du programme. Sa valeur est constante à la compilation , par opposition au mot clé readonly , dont la valeur est constante à l'exécution.

Par exemple, comme la vitesse de la lumière ne changera jamais, nous pouvons la stocker dans une constante.

const double c = 299792458;  // Speed of light

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

C'est essentiellement la même chose que d'avoir une return mass * 299792458 * 299792458 , car le compilateur remplacera directement c par sa valeur constante.

Par conséquent, c ne peut pas être modifié une fois déclaré. Ce qui suit produira une erreur de compilation:

const double c = 299792458;  // Speed of light 

c = 500;  //compile-time error

Une constante peut être préfixée avec les mêmes modificateurs d’accès que les méthodes:

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

const membres const sont static par nature. Cependant, l'utilisation de static explicitement n'est pas autorisée.

Vous pouvez également définir des constantes locales à la méthode:

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

Celles-ci ne peuvent pas être précédées d'un mot-clé private ou public , car elles sont implicitement locales à la méthode dans laquelle elles sont définies.


Tous les types ne peuvent pas être utilisés dans une déclaration const . Les types de valeur autorisés sont les types prédéfinis sbyte , byte , short , ushort , int , uint , long , ulong , char , float , double , decimal , bool et tous les types enum . Essayer de déclarer des membres const avec d'autres types de valeur (tels que TimeSpan ou Guid ) échouera à la compilation.

Pour la string type de référence prédéfinie spéciale, les constantes peuvent être déclarées avec n'importe quelle valeur. Pour tous les autres types de référence, les constantes peuvent être déclarées mais doivent toujours avoir la valeur null .


Comme les valeurs const sont connues à la compilation, elles sont autorisées en tant qu'étiquettes de case dans une instruction switch , en tant qu'arguments standard pour les paramètres facultatifs, en tant qu'arguments pour attribuer des spécifications, etc.


Si les valeurs const sont utilisées dans différents assemblys, il faut faire attention au contrôle de version. Par exemple, si l'assembly A définit un public const int MaxRetries = 3; , et l'assembly B utilise cette constante, puis si la valeur de MaxRetries est modifiée ultérieurement à 5 dans l'assembly A (qui est ensuite MaxRetries ), cette modification ne sera pas effective dans l'assembly B, sauf si l' assembly B est également recompilé (avec une référence à la nouvelle version de A).

Pour cette raison, si une valeur peut changer dans les révisions futures du programme et si la valeur doit être visible publiquement, ne déclarez pas cette valeur const sauf si vous savez que tous les assemblys dépendants seront recompilés chaque fois que quelque chose est modifié. L'alternative consiste à utiliser static readonly au lieu de const , qui est résolu à l'exécution.