Loupe

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";
A noter que la string interpolation est aussi supportée par de nombreux langages modernes (TypeScript, Dart, ...)

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";
 
var url = ToUrlFriendly($"https://www.google.com/search?q={search}");

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.

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus