Question

Y at-il un moyen facile de créer une chaîne multiligne littérale 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?

Était-ce utile?

La solution

Vous pouvez utiliser le symbole @ devant un string pour former un string verbatim littéral :

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

Vous avez également n'avez pas échapper à des caractères spéciaux quand vous utilisez cette méthode, à l'exception des doubles guillemets, comme indiqué dans la réponse de Jon Skeet.

Autres conseils

Il est appelé string verbatim littéral en C #, et il est juste une question de mettre @ avant le littéral. Non seulement cela permet plusieurs lignes, mais il est aussi désactivé échapper. Ainsi, par exemple, vous pouvez faire:

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

Le seul bit d'Évasion est que si vous voulez un guillemet, vous devez ajouter un symbole à double citation supplémentaire:

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

Une autre Gotcha à surveiller est l'utilisation de littéraux de chaîne dans string.Format. Dans ce cas, vous devez échapper accolades / crochets « { » 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)

Le problème avec l'utilisation que je trouve littéral de chaîne est qu'il peut rendre votre code semble un peu « bizarre » parce que pour ne pas obtenir des espaces dans la chaîne elle-même, il doit être complètement Aligné à gauche :

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

Beurk.

Alors la solution que je préfère utiliser, ce qui maintient 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 juste logiquement diviser les lignes d'une instruction SQL comme vous êtes et ne pas vraiment besoin d'une nouvelle ligne, vous pouvez toujours remplacer Environment.NewLine pour " ".

Comme un côté note, avec C # 6.0, vous pouvez maintenant combiner des chaînes interpolés avec la chaîne littérale mot à mot:

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

Pourquoi les gens gardent des chaînes confuses avec chaînes littérales? La réponse acceptée est une réponse à une autre question; pas celui-ci.

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

En gros, une chaîne de caractères est une région de mémoire d'ordinateur qui, lors de l'exécution d'un programme, contient une séquence d'octets qui peuvent être mis en correspondance avec un texte de caractères. Une chaîne littérale, d'autre part, est un morceau de code source, non encore établi, qui représente la valeur utilisée pour initialiser une chaîne plus tard, au cours 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 pas produire une chaîne de trois lignes, mais une seule ligne; la concaténation des trois cordes (chacune initialisées à partir d'un autre littéral) dont aucun ne contient un modificateur de nouvelle ligne.

Qu'est-ce que l'OP semble demander -au moins ce que je poserais avec les mots: n'est pas comment introduire, dans la chaîne compilé, les sauts de ligne qui miment ceux trouvés dans le code source, mais comment briser pour la clarté d'une longue ligne de texte dans le code source sans introduire des ruptures dans la chaîne compilée. Et sans nécessiter un temps d'exécution prolongé, passé se joindre aux multiples sous-chaînes provenant du code source. Comme les anti-slash suivi dans une chaîne multiligne littérale en javascript ou C ++.

Suggérant l'utilisation de chaînes in extenso, StringBuilders Nevermind String.Joins ou fonctions imbriquées même avec des inversions de cordes et ce pas, me fait penser que les gens ne sont pas vraiment comprendre la question. Ou peut-être que je ne comprends pas.

Pour autant que je sache, C # ne pas (du moins dans la version Paléolithique je suis toujours en utilisant, de la décennie précédente) ont une caractéristique de produire proprement chaîne multiligne littéraux qui peuvent être résolus au cours compilation plutôt que l'exécution.

Peut-être que les versions actuelles ne prennent en charge, mais je pensais que je partagerais la différence que je perçois entre les cordes et les chaînes littérales.

Mise à jour:

(Du commentaire de MeowCat2012) Vous pouvez. L'approche « + » par OP est le meilleur. Selon les spécifications de l'optimisation est garanti: http://stackoverflow.com/a/288802/9399618

Je ne l'ai pas vu, donc je vais poster ici (si vous êtes intéressé à faire passer une chaîne que vous pouvez le faire aussi bien.) L'idée est que vous pouvez briser la chaîne sur plusieurs lignes et ajouter votre propre contenu (également sur plusieurs lignes) de quelque façon que vous le souhaitez. Ici « tableName » peut être transmis 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
                                )";
    }

Vous pouvez utiliser @ et "" .

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

Oui, vous pouvez diviser une chaîne en sur plusieurs lignes sans introduire de nouvelles lignes dans la chaîne réelle, mais il aint assez:

string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";

L'astuce consiste à introduire un code qui permet d'évaluer à vider, et que le code peut contenir des sauts de ligne sans affecter la sortie. Je me suis adapté cette approche de cette réponse à une question similaire.

Il y a apparemment une certaine confusion quant à ce que la question est, mais il y a deux conseils que ce que nous voulons ici est une chaîne de caractères ne contenant pas de caractères de nouvelle ligne, dont la définition s'étend sur plusieurs lignes. (Dans les commentaires il le dit, et « voici ce que j'ai » montre le code qui ne crée pas une chaîne avec des sauts de ligne dedans)

Ce test unitaire montre l'intention:

    [TestMethod]
    public void StringLiteralDoesNotContainSpaces()
    {
        string query = "hi"
                     + "there";
        Assert.AreEqual("hithere", query);
    }

Modifier la définition ci-dessus de requête qui est une chaîne littérale, au lieu de la concaténation de deux chaînes littérales qui peuvent ou peuvent ne pas être optimisé en un seul par le compilateur.

L'approche C serait de mettre fin à chaque ligne avec une barre oblique inverse, ce qui provoque le retour à la ligne à échapper et apparaissent pas dans la sortie. Malheureusement, il y a encore alors la question que chaque ligne après la première doit être aligné à gauche afin de ne pas ajouter des espaces supplémentaires au résultat.

Il n'y a qu'une seule option qui ne repose pas sur les optimisations du compilateur qui pourrait ne pas se produire, ce qui est de mettre votre définition sur une seule ligne. Si vous voulez compter sur les optimisations du compilateur, le + vous avez déjà est grand; vous n'avez pas à gauche aligner la chaîne, vous ne recevez pas les nouvelles lignes dans le résultat, et il est une seule opération, pas d'appels de fonction, d'attendre optimisation.

Si vous ne voulez pas d'espaces / sauts de ligne, l'ajout de la chaîne 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 les si vous le souhaitez.

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 le SplitLineToMultiline (), vous devez définir la chaîne que vous souhaitez utiliser et la longueur de la ligne, il est très simple. Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top