Pourquoi les accolades en C# sont-elles un casse-tête ?
\n\nAvez-vous déjà écrit du code en C#, voulu afficher un texte comme {Nom}: {Valeur}, et obtenu à la place une FormatException ? Si oui, vous n'êtes pas seul. La question « How to escape curly brace in String.Format » sur Stack Overflow a recueilli des dizaines de milliers de vues. Et ce n'est pas un hasard : les accolades {} en C# ont une signification particulière — elles désignent un emplacement pour la substitution de variables.
Mais que faire si vous devez afficher les accolades elles-mêmes comme des caractères ordinaires ? Par exemple, pour du JSON, des modèles, la génération de code ou simplement pour un formatage élégant de rapport ? Aujourd'hui, nous allons explorer ce sujet de A à Z : de l'échappement simple aux astuces avancées avec StringBuilder et l'interpolation de chaînes.
Comment échapper les accolades : la règle de base
\n\nLa réponse est simple et élégante : doublez l'accolade. Si vous voulez afficher une accolade ouvrante {, écrivez {{. Pour une accolade fermante }, écrivez }}. C# comprendra qu'il ne s'agit pas d'un espace réservé, mais d'un caractère ordinaire.
Voici l'exemple le plus simple :
\n\nstring result = string.Format("Valeur entre accolades : {{0}}", 42);\nConsole.WriteLine(result);\n// Affichage : Valeur entre accolades : {0}\n\nRemarque : {{0}} n'est pas un espace réservé, mais une paire d'accolades échappées contenant le chiffre 0. Si nous avions écrit {0}, nous aurions obtenu la valeur de la variable (le nombre 42).
Erreur typique de débutant
\n\nLes débutants écrivent souvent ceci :
\n\n// ERREUR !\nstring bad = string.Format("Bonjour, {name}!", name);\n// FormatException : Input string was not in a correct format.\n\nPourquoi ? Parce que C# attend un index numérique entre les accolades ({0}, {1}), et non un nom de variable. Pour les noms, il faut utiliser l'interpolation de chaînes (voir ci-dessous) ou spécifier explicitement les index.
Exemples pratiques : du simple au complexe
\n\nExaminons plusieurs scénarios réels où l'échappement des accolades est nécessaire.
\n\n1. Affichage de JSON ou XML à des fins de débogage
\n\nImaginez que vous écrivez un journaliseur et souhaitez afficher une chaîne JSON avec substitution de valeur :
\n\nint userId = 101;\nstring json = string.Format("{{\\"userId\\": {0}, \\"name\\": \\"Alice\\"}}", userId);\nConsole.WriteLine(json);\n// Affichage : {"userId": 101, "name": "Alice"}\n\nIci, {{ et }} créent les accolades externes du JSON, tandis que {0} insère le nombre.
2. Génération de modèles de code
\n\nSupposons que vous écriviez un générateur de code en C#. Vous devez créer une chaîne avec un modèle pour un autre langage (par exemple, Python ou JavaScript) :
\n\nstring template = string.Format("def {0}():\\n return {{0}}", "calculate");\nConsole.WriteLine(template);\n// Affichage :\n// def calculate():\n// return {0}\n\nRemarque : {{0}} dans la chaîne de sortie n'est plus un espace réservé C#, mais une partie du code généré (par exemple, pour Python).
3. Formatage avec plusieurs espaces réservés et accolades
\n\nLorsqu'il faut mélanger substitutions et échappement, l'essentiel est de ne pas se perdre dans les index :
\n\nstring name = "Bob";\nint age = 30;\nstring message = string.Format("Utilisateur {{ {0} }} (âge : {1})", name, age);\nConsole.WriteLine(message);\n// Affichage : Utilisateur { Bob } (âge : 30)\n\nIci, {{ donne {, }} donne }, et {0} et {1} insèrent les valeurs.
Alternatives à String.Format : interpolation de chaînes et StringBuilder
\n\nBien que string.Format soit un classique, le C# moderne offre des moyens plus pratiques. Comparons-les.
Interpolation de chaînes (C# 6+)
\n\nL'interpolation, c'est la magie du $ devant la chaîne. Elle est plus lisible, mais l'échappement des accolades reste