Existe-t-il un moyen simple 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;
C # a-t-il quelque chose de similaire?
42
tant que paramètre, surtout s'il provient d'une entrée utilisateur, pour éviter l'injection SQL.Réponses:
Vous pouvez utiliser le
@
symbole devant unstring
pour former un littéral de chaîne textuel :Vous n'avez pas non plus à échapper les caractères spéciaux lorsque vous utilisez cette méthode, à l'exception des guillemets doubles comme indiqué dans la réponse de Jon Skeet.
la source
@"my string".Replace(Environment.NewLine, "")
Cela s'appelle un littéral de chaîne textuelle en C #, et il s'agit simplement de mettre @ avant le littéral. Non seulement cela autorise plusieurs lignes, mais cela désactive également l'échappement. Ainsi, par exemple, vous pouvez faire:
Cela inclut cependant les sauts de ligne (en utilisant le saut de ligne que votre source possède) dans la chaîne. Pour SQL, cela est non seulement inoffensif mais améliore probablement la lisibilité partout où vous voyez la chaîne - mais à d'autres endroits, il peut ne pas être nécessaire, auquel cas vous devrez soit ne pas utiliser un littéral de chaîne textuelle multi-lignes pour commencer, ou supprimez-les de la chaîne résultante.
Le seul échappatoire est que si vous voulez un guillemet double, vous devez ajouter un symbole de guillemet double supplémentaire:
la source
Le problème avec l'utilisation du littéral de chaîne que je trouve est qu'il peut rendre votre code un peu " bizarre " parce que pour ne pas obtenir d'espaces dans la chaîne elle-même, il doit être complètement aligné à gauche:
Beurk.
Donc, la solution que j'aime utiliser, qui garde tout bien aligné avec le reste de votre code est:
Et bien sûr, si vous voulez simplement diviser logiquement les lignes d'une instruction SQL comme vous êtes et n'avez pas réellement besoin d'une nouvelle ligne, vous pouvez toujours simplement remplacer
Environment.NewLine
par" "
.la source
Un autre problème à surveiller est l'utilisation des littéraux de chaîne dans string.Format. Dans ce cas, vous devez échapper les accolades / crochets '{' et '}'.
la source
En remarque, avec C # 6.0, vous pouvez désormais combiner des chaînes interpolées avec le littéral de chaîne textuel:
la source
$@"{{example literal text { fooString }. }}"
cela peut en dérouter certains car Angular, React et Vue.js utilisent la convention opposée.Pourquoi les gens confondent-ils les chaînes avec les 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 de le mal lire. Ou peut-être que je le lis 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 en caractères de texte. Un littéral de chaîne, d'autre part, est un morceau de code source, pas encore compilé, qui représente la valeur utilisée pour initialiser une chaîne ultérieurement, pendant l'exécution du programme dans lequel il apparaît.
En C #, la déclaration ...
... ne produit pas une chaîne à 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 - du moins ce que je demanderais avec ces mots - 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 rompre pour plus de clarté un long , une seule ligne de texte dans le code source sans introduire de rupture dans la chaîne compilée. Et sans nécessiter un temps d'exécution prolongé, vous avez passé à joindre les multiples sous-chaînes provenant du code source. Comme les barres obliques inverses de fin dans un littéral de chaîne multiligne en javascript ou C ++.
Le fait de suggérer l'utilisation de chaînes textuelles, de
StringBuilder
s nevermind , deString.Join
s ou même de fonctions imbriquées avec des inversions de chaînes et autres, 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 (du moins dans la version paléolithique que j'utilise encore, de la décennie précédente) pour 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.
Peut-être que les versions actuelles le prennent en charge, mais je pensais partager la différence que je perçois entre les chaînes et les littéraux de chaîne.
MISE À JOUR:
(D'après le commentaire de MeowCat2012) Vous pouvez. L'approche "+" par OP est la meilleure. Selon les spécifications, l'optimisation est garantie: http://stackoverflow.com/a/288802/9399618
la source
Je ne l'ai pas vu, donc je le posterai ici (si vous êtes intéressé à passer une chaîne, vous pouvez également le faire.) L'idée est que vous pouvez décomposer la chaîne sur plusieurs lignes et ajouter votre propre contenu (également sur plusieurs lignes) comme vous le souhaitez. Ici, "tableName" peut être passé dans la chaîne.
la source
createTable("MyTable");
dans tous les cas, la question de l'OP était de savoir comment entrer des littéraux de chaîne multiligne directement dans le code , pas comment construire des requêtes de base de données en soi. :)Vous pouvez utiliser @ et "" .
la source
Oui, vous pouvez diviser une chaîne en plusieurs lignes sans introduire de nouvelles lignes dans la chaîne réelle, mais ce n'est pas joli:
L'astuce consiste à introduire du code qui s'évalue à vide, et ce code peut contenir des retours à la ligne sans affecter la sortie. J'ai adapté cette approche de cette réponse à une question similaire.
Il y a apparemment une certaine confusion quant à la question, mais il y a deux indices que ce que nous voulons ici est un littéral de chaîne ne contenant aucun caractère 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 du code qui ne crée pas de chaîne avec des retours à la ligne)
Ce test unitaire montre l'intention:
Modifiez la définition de requête ci-dessus afin qu'il s'agisse d'un littéral de chaîne au lieu de la concaténation de deux littéraux de chaîne qui peuvent ou non être optimisés en un seul par le compilateur.
L'approche C ++ consisterait à terminer chaque ligne par une barre oblique inverse, ce qui entraînerait l'échappement du caractère de nouvelle ligne et n'apparaîtrait pas dans la sortie. Malheureusement, il y a toujours le problème que chaque ligne après la première doit être alignée afin de ne pas ajouter d'espace supplémentaire au résultat.
Il n'y a qu'une seule option qui ne dépend pas des optimisations du compilateur qui pourraient ne pas se produire, qui est de mettre votre définition sur une seule ligne. Si vous voulez vous fier aux optimisations du compilateur, le + que vous avez déjà est excellent; vous n'avez pas à aligner la chaîne à gauche, vous n'obtenez pas de retour à la ligne dans le résultat, et ce n'est qu'une opération, aucun appel de fonction, pour attendre l'optimisation.
la source
Ajoutez plusieurs lignes: utilisez @
Ajoutez des valeurs de chaîne au milieu: utilisez $
Chaîne de plusieurs lignes Ajoutez des valeurs au milieu: utilisez $ @
la source
Si vous ne voulez pas d'espaces / de nouvelles lignes, l'ajout de chaînes semble fonctionner:
Vous pouvez exécuter ce qui précède ici si vous le souhaitez.
la source
Je sais que je suis un peu en retard à la fête, mais je veux recommander https://www.buildmystring.com/ aux futurs lecteurs de ce fil. Vous pouvez convertir n'importe quel code en littéral de chaîne C # en utilisant ce site.
la source
Vous pouvez utiliser ces deux méthodes:
Dans le SplitLineToMultiline (), vous devez définir la chaîne que vous souhaitez utiliser et la longueur de ligne, c'est très simple. Merci .
la source