web-dev-qa-db-fra.com

Littéral chaîne interpolée multiligne C #

C # 6 apporte la prise en charge du compilateur pour les littéraux de chaîne interpolés avec la syntaxe suivante:

var person = new { Name = "Bob" };

string s = $"Hello, {person.Name}.";

C'est parfait pour les chaînes courtes, mais si vous voulez produire une chaîne plus longue, faut-il l'indiquer sur une seule ligne?

Avec d'autres types de chaînes, vous pouvez:

    var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}",
        height,
        width,
        background);

Ou:

var multi2 = string.Format(
    "Height: {1}{0}" +
    "Width: {2}{0}" +
    "Background: {3}",
    Environment.NewLine,
    height,
    width,
    background);

Je ne peux pas trouver un moyen d'y parvenir avec une interpolation de chaîne sans avoir tout d'une ligne:

var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}";

Je me rends compte que dans ce cas, vous pouvez utiliser \r\n au lieu de Environment.NewLine (moins portable), ou l'extraire vers un local, mais il y aura des cas où vous ne pourrez pas le réduire en dessous d'une ligne sans perdre la force sémantique.

Est-ce simplement le cas que l'interpolation de chaîne ne devrait pas être utilisée pour les longues chaînes?

Devrions-nous simplement utiliser StringBuilder pour les chaînes plus longues?

var multi4 = new StringBuilder()
    .AppendFormat("Width: {0}", width).AppendLine()
    .AppendFormat("Height: {0}", height).AppendLine()
    .AppendFormat("Background: {0}", background).AppendLine()
    .ToString();

Ou y a-t-il quelque chose de plus élégant?

43
Drew Noakes

Vous pouvez combiner $ et @ ensemble pour obtenir un littéral de chaîne interpolé à plusieurs lignes:

string s =
$@"Height: {height}
Width: {width}
Background: {background}";

Source: Lignes d'interpolation de chaînes longues en C # 6 (Merci à @Ric d'avoir trouvé le fil!)

83
Dmytro Shevchenko

J'utiliserais probablement une combinaison

var builder = new StringBuilder()
    .AppendLine($"Width: {width}")
    .AppendLine($"Height: {height}")
    .AppendLine($"Background: {background}");
4
sara

Personnellement, je viens d'ajouter une autre chaîne interpolée en utilisant la concaténation de chaînes

Par exemple

var multi  = $"Height     : {height}{Environment.NewLine}" +
             $"Width      : {width}{Environment.NewLine}" +
             $"Background : {background}";

Je trouve que c'est plus facile à formater et à lire.

Ceci aura aura une surcharge supplémentaire par rapport à l’utilisation de $ @ "", mais ce n’est visible que dans les applications les plus critiques. En mémoire, les opérations sur les chaînes sont extrêmement économiques par rapport aux E/S de données. Lire une seule variable de la base de données prendra des centaines de fois plus longtemps dans la plupart des cas.

1
Andrew Monteith