Voir le flux RSS

François DORIN

[Actualité] C# : comprendre les différences entre readonly et const

Note : 2 votes pour une moyenne de 5,00.
par , 17/05/2018 à 22h25 (754 Affichages)

Nom : logo-csharp.png
Affichages : 4449
Taille : 50,9 Ko

Aujourd'hui, un petit mot sur une subtilité du langage C# : les différentes manières de déclarer une constante.

Il existe deux grandes méthodes :
  • déclarer une variable avec les mots-clés static const ;
  • déclarer une variable avec les mots clé static readonly.


Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
public static class MaClasse
{
    public const string MA_VARIABLE_CONSTANTE = "Ceci est une constante";
    public static readonly string MA_VARIABLE_READONLY = "Ceci est une variable readonly";
}

Bien qu'a priori similaires, ces deux approches ont des comportements qui peuvent être très différents.

Utilisation de const
Une variable déclarée constante est, comme son nom l'indique... constante. Il sera impossible de modifier cette variable. Elle doit être impérativement initialisée lors de sa déclaration, sans quoi le compilateur va générer une erreur.

Une variable déclarée comme constante n'est pas véritablement une variable. En fait, quand le compilateur rencontre une constante, il remplace directement la valeur de la constante. Ainsi, avoir le code suivant
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
string str = MaClasse.MA_VARIABLE_CONSTRANTE;
est strictement équivalent à
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
string str = "Ceci est une constante";
Autrement dit, une variable const n'a pas d'espace réservé en mémoire.

À noter également que l'initialisation d'une variable constante nécessite que la valeur puisse être déterminée au moment de la compilation. On oublie donc les appels à une méthode permettant de récupérer les valeurs depuis une base de données par exemple.

On peut rapprocher cette notion des définitions préprocesseur du C/C++, les fameux #define. Sauf que ces constantes C# sont fortement typées.

Utilisation de readonly
La sémantique d'une variable déclarée readonly est légèrement différente. Une variable readonly n'est en lecture seule qu'en dehors d'un constructeur. Ainsi, dans le constructeur d'une classe, il est tout à fait possible de modifier une telle variable. Pour une variable que l'on souhaite "constante", c'est au niveau du constructeur statique de la classe que tout ce joue.

Aussi, la déclaration précédente est strictement équivalente à :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
public static class MaClasse
{
    public const string MA_VARIABLE_CONSTANTE = "Ceci est une constante";
    public static readonly string MA_VARIABLE_READONLY;
 
    static MaClasse()
   {
      MA-VARIABLE_READONLY = "Ceci est une variable readonly";
   }
}

Comme on peut le constater, une variable readonly n'a pas besoin d'être initialisée lors de sa déclaration. Elle peut être initialisée depuis le constructeur de la classe.

De plus, l'expression permettant d'initialiser la variable n'a pas a être déterminable à la compilation comme pour les constantes. Il peut s'agir de n'importe quelle expression ! Ainsi, une variable readonly peut très bien contenir une valeur provenant d'un fichier, d'une base de données sans aucun souci.

Contrairement à une variable marquée const, une variable readonly est une véritable variable et dispose donc de son propre emplacement en mémoire.

const : la blague des assembly externes
Un dernier point qu'il est primordial de bien comprendre sous peine d'avoir des surprises : l'accès à une variable const ou readonly définie dans un autre assembly :
  • readonly : lors de la compilation, une référence à la variable définie dans l'assembly externe est utilisée ;
  • const : lors de la compilation, la valeur de la variable est lue depuis l'assembly externe et est remplacée dans le code en cours de compilation.


En pratique, cela ne change pas grand-chose, sauf... si l'assembly externe est mis à jour et que la valeur change :
  • readonly : une référence à la variable étant utilisée, la nouvelle valeur est automatiquement mise à jour au sein de tous les assembly la référençant ;
  • const : la valeur n'est pas mise à jour tant que l'assembly utilisant cette constante externe n'a pas été recompilé.


Résumons...
Ainsi, les deux approches, bien que similaires, sont très différentes en pratique.

Pour résumer, voici ce qu'il faut retenir :
  • readonly doit être utilisé si la variable doit être constante durant la durée de vie de votre programme ;
  • const doit être utilisé si la variable est une véritable constante dont la valeur ne changera jamais, non seulement durant la durée de vie de votre programme, mais aussi entre les différents appels.


En cas de doute, utilisez la variante avec readonly. Vous n'aurez jamais de soucis avec !

Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Viadeo Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Twitter Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Google Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Facebook Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Digg Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Delicious Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog MySpace Envoyer le billet « C# : comprendre les différences entre readonly et const » dans le blog Yahoo

Mis à jour 18/05/2018 à 02h44 par Malick

Catégories
DotNET , C#

Commentaires

  1. Avatar de badoquealex
    • |
    • permalink
    Article très intéressant, surtout pour moi qui ai appris le C# par la pratique.
    Je connaissais la subtilité concernant l’initialisation du readonly dans le constructeur, mais pas le "one more thing".
  2. Avatar de michaelvd
    • |
    • permalink
    Très sympa.. C'est agréable de s'arrêter un instant sur quelque chose de précis.
  3. Avatar de wakan
    • |
    • permalink
    C'est bien vu comme format billet.
    J'ai bien apprécié la phrase "const : la valeur n'est pas mise à jour tant que l'assembly utilisant cette constante externe n'a pas été recompilé"
    Même si cela parait logique, c'est bien de ce le rappeler.
    J'attend le prochain avec impatience.
    Merci
  4. Avatar de Abdellah2010
    • |
    • permalink
    Merci bien d'enlever cette ambiguïté.