C# : A la découverte de la classe FormattableString
Aujourd’hui, je viens de découvrir la class FormattableString 2 ans après que ça soit sorti.
Cette classe a été ajoutée avec la fonctionnalité de string interpolation en C# 6.0.
String interpolation
Pour rappel, la string interpolation a été une petite révolution car elle nous a permis de rendre le code beaucoup plus clair.
Par exemple, pour formater une string je n’ai plus à écrire :
1
2
|
string firstName = "jérémy" ; var title = String.Format( "{0} est heureux" , firstName); |
Je peux écrire plus simplement :
1
2
|
string firstName = "jérémy" ; var title = $ "{firstName} est heureux" ; |
Mais en quoi est-ce lié aux FormattableString ?
Si vous voulez conserver cette chaîne de caractères et les variables sans calculer la string car vous avez besoin de garder les deux parties distinctes, .NET fournit la classe FormattableString.
Son utilisation est quasiment transparente :
1
2
|
string firstName = "jérémy" ; FormattableString title = $ "{firstName} est heureux" ; |
Par défaut, toute string interpolée est utilisable en tant que FormattableString sans écrire une seule ligne de code.
Un exemple d’utilisation
Un des usages intéressants pourrait être la transformation d'une FormattableString en string url encodée.
Grace à la méthode GetArguments()
nous allons récupérer les "variables" de la chaîne de caractère.
La propriété Format
correspond à la chaîne de caractère non transformée.
1
2
3
4
5
|
private string ToUrlFriendly(FormattableString formattableString) { var args = formattableString.GetArguments().Select(arg => WebUtility.UrlEncode(arg.ToString())).ToArray(); return string .Format(formattableString.Format, args); } |
L’utilisation de la fonction est très simple :
1
2
3
|
string search = "jérémie est heureux youtube" ; |
Va générer :
1
|
https: //www.google.com/search?q=j%C3%A9r%C3%A9mie+est+heureux+youtube |
A noter que la méthode FromSql de Entity Framework Core utilise elle aussi la classe FormattableString pour séparer les paramètres SQL de la requête SQL.
Et c'est disponible dans quelle version de .NET ?
Et le bonus c'est que cette classe est disponible quasiment dans toutes les versions de .NET à part silverlight :
- NET Framework 4.6+
- NET Core (toutes versions)
- NET standard 1.3+
- UWP
- Xamarin
Pour aller plus loin :
Happy coding.
Merci à Jérémy pour sa relecture attentive.
Commentaires