Chaîne littérale en C #

Existe-t-il un moyen simple de créer un littéral de chaîne multiligne en C #?

Voici ce que j’ai maintenant:

ssortingng 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?

Vous pouvez utiliser le symbole @ devant une ssortingng pour former un littéral de chaîne textuelle :

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

Vous n’avez pas non plus à é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.

C’est ce qu’on appelle un littéral littéral textuel en C #, et il suffit juste de mettre @ avant le littéral. Non seulement cela permet plusieurs lignes, mais cela désactive également l’échappement. Donc, par exemple, vous pouvez faire:

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

Le seul échappatoire est que si vous voulez un double devis, vous devez append un symbole de guillemet double supplémentaire:

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

Un autre piège à surveiller est l’utilisation de littéraux de chaîne dans ssortingng.Format. Dans ce cas, vous devez échapper les accolades / crochets ‘{‘ et ‘}’.

 // this would give a format exception ssortingng.Format(@"", aMagicValue) // this consortingved example would work ssortingng.Format(@"", aMagicValue) 

Le problème avec l’utilisation de chaînes littérales que je trouve est que cela peut rendre votre code un peu ” bizarre ” car pour ne pas avoir d’espaces dans la chaîne elle doit être complètement alignée:

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

Beurk.

Donc, la solution que j’aime utiliser, qui rest bien alignée avec le rest de votre code, est la suivante:

 var someSsortingng = Ssortingng.Join( Environment.NewLine, "The", "quick", "brown", "fox..."); 

Et bien sûr, si vous voulez simplement scinder les lignes d’une instruction SQL comme vous l’êtes et que vous n’avez pas besoin d’une nouvelle ligne, vous pouvez toujours remplacer Environment.NewLine par " " .

En guise de remarque, avec C # 6.0, vous pouvez maintenant combiner des chaînes interpolées avec le littéral de chaîne textuelle:

 ssortingng camlCondition = $@"    {(ssortingng)parameter}  "; 

Pourquoi les gens continuent-ils à confondre les chaînes avec les littéraux de chaîne? La réponse acceptée est une excellente 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 le PO, et il est frustrant de voir comment les gens continuent à le lire. Ou peut-être que je le comprends mal, je ne sais pas.

En gros, une chaîne est une région de la mémoire de l’ordinateur qui, pendant l’exécution d’un programme, contient une séquence d’octets pouvant être mappée à des caractères de texte. Un littéral de chaîne, par contre, est un morceau de code source, non encore compilé, qui représente la valeur utilisée pour initialiser une chaîne ultérieurement, lors de l’exécution du programme dans lequel elle apparaît.

En C #, l’énoncé …

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

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

Ce que l’OP semble demander – au moins ce que je demanderais avec ces mots – ce n’est pas comment introduire, dans la chaîne compilée, des sauts de ligne qui imitent ceux trouvés dans le code source, mais comment , une seule ligne de texte dans le code source sans introduire de coupures dans la chaîne compilée. Et sans exiger un temps d’exécution prolongé, passé à joindre les sous-chaînes multiples provenant du code source. Comme les backslashes à la fin d’une chaîne littérale multiligne en javascript ou en C ++.

En suggérant l’utilisation de chaînes textuelles, de SsortingngBuilder s, de Ssortingng.Join s ou même de fonctions nestedes avec des renversements de chaînes et ce qui ne l’est pas, je pense 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 fonctionnalité permettant de produire proprement des littéraux de chaîne multilignes qui peuvent être résolus lors de la compilation plutôt que de l’exécution.

Les versions actuelles le prennent peut-être en charge, mais je pensais partager la différence que je perçois entre les chaînes et les chaînes de caractères.

Je n’ai pas vu ceci, donc je le posterai 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 append votre propre contenu (également sur plusieurs lignes) de la manière que vous souhaitez. Ici, “tableName” peut être passé dans la chaîne.

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

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

 var mySsortingng = Ssortingng.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 vous le souhaitez.

Vous pouvez utiliser @ et “” .

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

Vous pouvez utiliser ces deux méthodes:

  private static Ssortingng ReverseSsortingng(Ssortingng str) { int word_length = 0; Ssortingng 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 stack = new Stack(ReverseSsortingng(input).Split(' ')); while (stack.Count > 0) { var word = stack.Pop(); if (word.Length > rowLength) { ssortingng head = word.Subssortingng(0, rowLength); ssortingng tail = word.Subssortingng(rowLength); word = head; stack.Push(tail); } if (line.Length + word.Length > rowLength) { result.AppendLine(line.ToSsortingng()); line.Clear(); } line.Append(word + " "); } result.Append(line); return result.ToSsortingng(); } 

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 .