Const vs Readonly en C# : quelle est la différence et quand utiliser quoi ?
\n\nChaque développeur C# se retrouve tôt ou tard face à un dilemme : déclarer une valeur comme const ou comme readonly ? À première vue, les deux mots-clés font la même chose — ils empêchent la modification d'une variable après son initialisation. Mais creusez un peu plus, et vous découvrirez un gouffre de différences qui impactent l'architecture, les performances et même la sécurité du code.
Dans cet article, nous ne nous contenterons pas d'énumérer des faits secs issus de la documentation. Nous analyserons des scénarios réels, montrerons les pièges à éviter et vous aiderons à faire un choix éclairé. C'est parti !
\n\nQu'est-ce que const en C# ?
\n\nConst est une constante de temps de compilation. Sa valeur doit être connue au moment de la compilation et ne peut pas changer à l'exécution.
\n\n- \n
- Ne peut être que de types primitifs :
int,double,string,bool,enumetnull. \n - Implicitement
static— appartient au type, pas à l'instance. \n - La valeur est directement intégrée dans le code à l'étape de compilation (comme une macro en C++). \n
- Ne peut pas être utilisé avec
newou des types de référence (saufstring). \n
public class MathConstants\n{\n public const double Pi = 3.14159;\n public const int MaxRetries = 5;\n public const string AppName = "MyApp";\n \n // Erreur ! Les types de référence (sauf string) ne sont pas autorisés\n // public const List<int> Numbers = new List<int>();\n}\n\nLorsque le compilateur rencontre const, il intègre littéralement la valeur dans le code IL. Cela signifie que si vous utilisez une constante provenant d'un autre assembly, et que vous modifiez ensuite sa valeur, les anciens assemblys continueront d'utiliser l'ancienne valeur — jusqu'à ce qu'ils soient recompilés.
Qu'est-ce que readonly en C# ?
\n\nReadonly est un champ qui ne peut être initialisé qu'au moment de la déclaration ou dans le constructeur de la classe. Après cela, il ne peut plus être modifié.
\n\n- \n
- Peut être de n'importe quel type : aussi bien de valeur que de référence. \n
- Peut être statique ou d'instance. \n
- La valeur est calculée à l'exécution (par exemple, on peut utiliser
newou appeler une méthode). \n - N'est pas intégré dans le code — c'est un champ ordinaire protégé en écriture. \n
public class Config\n{\n public readonly DateTime CreatedAt = DateTime.Now;\n public readonly List<string> Tags;\n public static readonly Guid InstanceId = Guid.NewGuid();\n \n public Config()\n {\n Tags = new List<string> { "csharp", "tutorial" };\n // Erreur ! Impossible de modifier après le constructeur\n // Tags = new List<string>();\n }\n}\n\nUne nuance importante : readonly ne protège que la référence, pas le contenu de l'objet. Si vous avez un readonly List<int>, vous ne pourrez pas lui assigner une nouvelle liste, mais vous pouvez librement ajouter ou supprimer des éléments.
Comparaison de const et readonly : tableau des différences
\n\nPour consolider le tout, voici une comparaison visuelle :
\n\n| Critère | \nconst | \nreadonly | \n
|---|---|---|
| Temps de calcul | \nCompilation | \nExécution (runtime) | \n
| Types de données | \nPrimitifs uniquement + string | \nTous les types | \n
| Statique | \nImplicitement static | \nPeut être static ou instance | \n
| Modifiabilité | \nJamais | \nUniquement dans le constructeur | \n
| Accès | \nComme
BlogsBook RecommendationsLire aussi
Requêtes HTTP en Python avec Requests : Guide complet
|