Introduction : un débat éternel qui reste d'actualité
\n\nImaginez la situation : vous écrivez du code en C# et vous devez déclarer une valeur qui ne doit pas changer. La première pensée — const. La seconde — static readonly. Et la troisième — « Mais quelle est la différence, au juste ? ».
Cette question est l'une des plus populaires sur Stack Overflow. Des milliers de développeurs, des débutants aux seniors, continuent de débattre de ce qui est le mieux. Et en 2025, avec la sortie des nouvelles versions de .NET et de C# 13, ce choix est devenu encore plus intéressant.
\n\nDans cet article, nous allons une fois pour toutes clarifier quand utiliser const et quand utiliser static readonly. Vous apprendrez non seulement la théorie, mais vous obtiendrez également des règles claires que vous pourrez appliquer dès aujourd'hui.
Que se cache-t-il derrière les modificateurs ?
\n\nconst : une constante rigide
\nLe modificateur const en C# est littéralement une valeur « gravée dans la pierre ». Elle doit être connue au moment de la compilation. Le compilateur substitue directement la valeur de la constante dans le code partout où elle est utilisée.
public class MathConstants\n{\n public const double Pi = 3.14159;\n public const int DaysInWeek = 7;\n public const string AppName = "MyApp";\n}\n\nNotez que const est toujours implicitement static. Vous ne pouvez pas écrire static const — le compilateur générera une erreur.
static readonly : une immuabilité flexible
\nLe modificateur static readonly est un champ qui est initialisé une seule fois et ne change plus. La principale différence : la valeur peut être calculée pendant l'exécution du programme.
public class AppSettings\n{\n public static readonly DateTime ReleaseDate = new DateTime(2025, 1, 15);\n public static readonly Guid InstanceId = Guid.NewGuid();\n public static readonly string ConfigPath = GetConfigPath();\n \n private static string GetConfigPath()\n {\n return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "config.json");\n }\n}\n\nDifférences clés : tableau de comparaison rapide
\n\nMettons tout en ordre dans un tableau clair :
\n\n| Caractéristique | \nconst | \nstatic readonly | \n
|---|---|---|
| Moment d'initialisation | \nCompilation | \nExécution (constructeur statique) | \n
| Types autorisés | \nUniquement les types primitifs (int, double, string, enum, bool) | \nTous les types (y compris les types référence) | \n
| Mémoire | \nLa valeur est copiée dans chaque assembly | \nRéférence unique en mémoire | \n
| Compatibilité des versions | \nProblèmes lors de la mise à jour des bibliothèques | \nSécurisé | \n
| Performance | \nMaximale (substitution à la compilation) | \nLéger surcoût lors du premier accès | \n
Quand choisir const ?
\n\nUtilisez const lorsque :
- \n
- La valeur est absolument immuable — constantes mathématiques (π, e), nombre de jours dans une semaine, constantes physiques. \n
- La valeur doit être disponible à la compilation — par exemple, pour les attributs, switch/case, paramètres par défaut. \n
- Vous contrôlez l'intégralité du code — et vous êtes sûr que la bibliothèque ne sera pas mise à jour séparément. \n
// Idéal pour const\npublic class Physics\n{\n public const double SpeedOfLight = 299792458; // m/s\n public const double GravitationalConstant = 6.67430e-11; // m³/(kg·s²)\n}\n\n// Utilisation dans un attribut —