Const vs Readonly en C# : que choisir et quelle est la différence ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Const vs Readonly en C# : quelle est la différence et quand utiliser quoi ?

\n\n

Chaque 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.

\n\n

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\n

Qu'est-ce que const en C# ?

\n\n

Const 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, enum et null.
  • \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 new ou des types de référence (sauf string).
  • \n
\n\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\n

Lorsque 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.

\n\n

Qu'est-ce que readonly en C# ?

\n\n

Readonly 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 new ou appeler une méthode).
  • \n
  • N'est pas intégré dans le code — c'est un champ ordinaire protégé en écriture.
  • \n
\n\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\n

Une 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.

\n\n

Comparaison de const et readonly : tableau des différences

\n\n

Pour consolider le tout, voici une comparaison visuelle :

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Critèreconstreadonly
Temps de calculCompilationExécution (runtime)
Types de donnéesPrimitifs uniquement + stringTous les types
StatiqueImplicitement staticPeut être static ou instance
ModifiabilitéJamaisUniquement dans le constructeur
AccèsComme

Blogs

Book Recommendations