Question Chaîne multiligne littérale en C #


Y at-il un moyen facile de créer un littéral de chaîne multiligne en C #?

Voici ce que j'ai maintenant:

string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";

Je sais que PHP a

<<<BLOCK

BLOCK;

Est-ce que C # a quelque chose de similaire?


732
2017-07-08 20:03


origine


Réponses:


Vous pouvez utiliser le @ symbole devant string pour former un verbatim chaîne littérale:

string query = @"SELECT foo, bar
FROM table
WHERE id = 42";

Toi aussi ne pas avoir à échapper à des caractères spéciaux lorsque vous utilisez cette méthode, sauf pour les guillemets comme indiqué dans la réponse de Jon Skeet.


1163
2017-07-08 20:04



Ça s'appelle un verbatim chaîne littérale en C #, et c'est juste une question de mettre @ avant le littéral. Non seulement cela autorise plusieurs lignes, mais il permet également de désactiver l'échappement. Ainsi, par exemple, vous pouvez faire:

string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";

Le seul moyen d'échapper est que si vous voulez un double guillemet, vous devez ajouter un double guillemet:

string quote = @"Jon said, ""This will work,"" - and it did!";

417
2017-07-08 20:06



Un autre gotcha à surveiller est l'utilisation de littéraux de chaîne dans string.Format. Dans ce cas, vous devez échapper les accolades / accolades '{' et '}'.

// this would give a format exception
string.Format(@"<script> function test(x) 
      { return x * {0} } </script>", aMagicValue)
// this contrived example would work
string.Format(@"<script> function test(x) 
      {{ return x * {0} }} </script>", aMagicValue)

89
2017-09-24 09:28



Le problème avec l'utilisation de la chaîne littérale que je trouve est que cela peut donner un peu d'apparence à votre code "bizarre"car pour ne pas avoir d'espaces dans la chaîne elle-même, elle doit être complètement alignée à gauche:

    var someString = @"The
quick
brown
fox...";

Yuck.

Donc, la solution que j'aime utiliser, qui garde tout bien aligné avec le reste de votre code est:

var someString = String.Join(
    Environment.NewLine,
    "The",
    "quick",
    "brown",
    "fox...");

Et bien sûr, si vous voulez simplement diviser logiquement les lignes d'une instruction SQL comme vous l'êtes et que vous n'avez pas réellement besoin d'une nouvelle ligne, vous pouvez toujours simplement remplacer Environment.NewLine pour " ".


70
2017-08-07 08:20



En note, avec C # 6.0, vous pouvez maintenant combiner des chaînes interpolées avec le littéral littéral verbatim:

string camlCondition = $@"
<Where>
    <Contains>
        <FieldRef Name='Resource'/>
        <Value Type='Text'>{(string)parameter}</Value>
    </Contains>
</Where>";

60
2017-08-13 06:58



Pourquoi les gens gardent-ils des chaînes confuses avec des littéraux de chaîne? La réponse acceptée est une excellente réponse à une question différente; pas à celui-ci.

Je sais que c'est un vieux sujet, mais je suis venu ici avec peut-être la même question que le PO, et c'est frustrant de voir comment les gens continuent à le mal interpréter. Ou peut-être que je le mal interprète, je ne sais pas.

Grosso modo, une chaîne est une région de la mémoire de l'ordinateur qui, au cours de l'exécution d'un programme, contient une séquence d'octets pouvant être mappés sur des caractères de texte. D'autre part, un littéral de chaîne est un morceau de code source, pas encore compilé, qui représente la valeur utilisée pour initialiser une chaîne plus tard, lors de l'exécution du programme dans lequel il apparaît.

En C #, la déclaration ...

 string query = "SELECT foo, bar"
 + " FROM table"
 + " WHERE id = 42";

... ne fait pas produire une chaîne de trois lignes, mais une seule doublure; la concaténation de trois chaînes (chacune initialisée à partir d'un littéral différent) dont aucune ne contient un modificateur de nouvelle ligne.

Ce que l'OP semble demander - du moins ce que je demanderais avec ces mots - n'est pas de savoir comment introduire, dans la chaîne compilée, des sauts de ligne qui imitent ceux trouvés dans le code source, mais comment rompre pour plus de clarté , une seule ligne de texte dans le code source sans pour autant introduire des ruptures dans la chaîne compilée. Et sans nécessiter un temps d'exécution étendu, passé à joindre les sous-chaînes multiples provenant du code source. Comme les barres obliques inverses dans une chaîne littérale multiligne en javascript ou en C ++.

Suggérer l'utilisation de chaînes verbatim, nevermind StringBuilders, String.Joins ou même des fonctions imbriquées avec des inversion de chaînes et quoi que ce soit, me fait penser que les gens ne comprennent pas vraiment la question. Ou peut-être que je ne le comprends pas.

Pour autant que je sache, C # n'a pas (au moins dans la version paléolithique que j'utilise encore, de la décennie précédente) une caractéristique pour produire proprement des cordes multilignes littéraux Cela peut être résolu pendant la compilation plutôt que l'exécution.

Peut-être que les versions actuelles le supportent, mais je pensais partager la différence que je perçois entre les chaînes et les chaînes littérales.


27
2017-07-17 17:08



Je n'ai pas vu cela, donc je vais le poster ici (si vous êtes intéressé à passer une chaîne, vous pouvez le faire aussi.) L'idée est que vous pouvez casser la chaîne sur plusieurs lignes et ajouter votre propre contenu (aussi sur plusieurs lignes) comme vous le souhaitez. Ici, "tableName" peut être passé dans la chaîne.

    private string createTableQuery = "";

    void createTable(string tableName)
    {

         createTableQuery = @"CREATE TABLE IF NOT EXISTS
                ["+ tableName  + @"] (
               [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
               [Key] NVARCHAR(2048)  NULL, 
               [Value] VARCHAR(2048)  NULL
                                )";
    }

10
2017-09-19 03:40



Si vous ne voulez pas d'espaces / de nouvelles lignes, l'ajout de chaînes semble fonctionner:

var myString = String.Format(
  "hello " + 
  "world" +
  " i am {0}" +
  " and I like {1}.",
  animalType,
  animalPreferenceType
);
// hello world i am a pony and I like other ponies.

Vous pouvez exécuter ce qui précède ici si tu veux.


2
2018-05-13 08:11



Vous pouvez utiliser @ et "".

        string sourse = @"{
        ""items"":[
        {
            ""itemId"":0,
            ""name"":""item0""
        },
        {
            ""itemId"":1,
            ""name"":""item1""
        }
        ]
    }";

0
2018-06-06 08:51



Vous pouvez utiliser ces deux méthodes:

    private static String ReverseString(String str)
    {
        int word_length = 0;
        String result = "";
        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] == ' ')
            {
                result = " " + result;
                word_length = 0;
            }
            else
            {
                result = result.Insert(word_length, str[i].ToString());
                word_length++;
            }
        }
        return result;
    }
//NASSIM LOUCHANI
    public static string SplitLineToMultiline(string input, int rowLength)
    {
        StringBuilder result = new StringBuilder();
        StringBuilder line = new StringBuilder();

        Stack<string> stack = new Stack<string>(ReverseString(input).Split(' '));

        while (stack.Count > 0)
        {
            var word = stack.Pop();
            if (word.Length > rowLength)
            {
                string head = word.Substring(0, rowLength);
                string tail = word.Substring(rowLength);

                word = head;
                stack.Push(tail);
            }

            if (line.Length + word.Length > rowLength)
            {
                result.AppendLine(line.ToString());
                line.Clear();
            }

            line.Append(word + " ");
        }

        result.Append(line);
        return result.ToString();
    }

Dans SplitLineToMultiline (), vous devez définir la chaîne que vous voulez utiliser et la longueur de la ligne, c'est très simple. Je vous remercie .


-7
2018-01-31 09:05