Многострочных строковых литералов в C#
есть ли простой способ создать многострочный строковый литерал в C#?
вот что у меня есть сейчас:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
Я знаю, что PHP имеет
<<<BLOCK
BLOCK;
есть ли у C# что-то подобное?
10 ответов:
можно использовать
@
символ передstring
в форме дословно строковый литерал:string query = @"SELECT foo, bar FROM table WHERE id = 42";
вы не нужно избегать специальных символов при использовании этого метода, за исключением двойных кавычек, как показано в ответе Джона Скита.
Это называется дословно строковый литерал в C#, и это просто вопрос поставить @ перед буквальным. Это не только позволяет использовать несколько строк, но и отключает экранирование. Так, например, вы можете сделать:
string query = @"SELECT foo, bar FROM table WHERE name = 'a\b'";
единственный бит экранирования заключается в том, что если вы хотите двойную кавычку, вам нужно добавить дополнительный символ двойной кавычки:
string quote = @"Jon said, ""This will work,"" - and it did!";
еще одна проблема, за которой нужно следить, - это использование строковых литералов в строке.Формат. В этом случае вам нужно избежать фигурных скобок/скобок '{' и '}'.
// 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)
проблема с использованием строкового литерала, который я нахожу, заключается в том, что он может заставить ваш код выглядеть немного "странно " потому что для того, чтобы не получить пробелы в самой строке, она должна быть полностью выровнена по левому краю:
var someString = @"The quick brown fox...";
Фу.
Итак, решение, которое мне нравится использовать, которое держит все хорошо выровненным с остальной частью вашего кода:
var someString = String.Join( Environment.NewLine, "The", "quick", "brown", "fox...");
и конечно, если вы просто хотите логически разделить строки инструкции SQL, как вы, и не делаете на самом деле нужна новая строка, вы всегда можете просто заменить
Environment.NewLine
на" "
.
в качестве примечания, с C# 6.0 теперь вы можете комбинировать интерполированные строки с дословным строковым литералом:
string camlCondition = $@" <Where> <Contains> <FieldRef Name='Resource'/> <Value Type='Text'>{(string)parameter}</Value> </Contains> </Where>";
почему люди продолжают путать строки со строковыми литералами? Принятый ответ-это отличный ответ на другой вопрос;не на этот.
Я знаю, что это старая тема, но я пришел сюда с тем же вопросом, что и OP, и мне неприятно видеть, как люди продолжают неправильно его читать. Или, может быть, я неправильно его понимаю, я не знаю.
грубо говоря, строка-это область памяти компьютера, которая во время выполнения программы содержит последовательность байты, которые могут быть сопоставлены с текстовыми символами. Строковый литерал, с другой стороны, представляет собой фрагмент исходного кода, еще не скомпилированный, который представляет значение, используемое для инициализации строки позже, во время выполнения программы, в которой он появляется.
В C#, заявление...
string query = "SELECT foo, bar" + " FROM table" + " WHERE id = 42";
... не создать трехстрочную строку, но один лайнер; конкатенация трех строк (каждая инициализирована из другого литерала), ни одна из которых не содержит модификатор новой строки.
то, что ОП, кажется, спрашивает -по крайней мере, то, что я бы спросил с этими словами - это не то, как ввести в скомпилированную строку разрывы строк, которые имитируют те, которые находятся в исходном коде, но как разбить для ясности длинную единственную строку текста в исходном коде без введение разрывов в скомпилированной строке. И без необходимости длительного времени выполнения, потраченного на объединение нескольких подстрок, поступающих из исходного кода. Как конечные обратные косые черты в многострочном строковом литерале в javascript или C++.
предлагая использовать дословные строки, nevermind
StringBuilder
s,String.Join
s или даже вложенные функции с реверсами строк, а что нет, заставляет меня думать, что люди на самом деле не понимают вопрос. Или, может быть, я этого не понимаю.насколько я знаю, C# не имеет (по крайней мере, в палеолитической версии, которую я все еще использую, с предыдущего десятилетия) функции для чистого производства многострочная строка литералы это можно решить во время компиляции, а не выполнения.
возможно, текущие версии поддерживают его, но я думал, что разделю разницу, которую я воспринимаю между строками и строковыми литералами.
Я не видел этого, поэтому я опубликую его здесь (Если вы заинтересованы в передаче строки, вы можете сделать это также.) Идея заключается в том, что вы можете разбить строку на несколько строк и добавить свой собственный контент (на несколько строк) в любом случае вы хотите. Здесь "tableName" может быть передан в строку.
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 )"; }
Если вы не хотите пробелы / новые строки, добавление строки, кажется, работает:
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.
вы можете запустить выше здесь если вам нравится.
можно использовать @ и "".
string sourse = @"{ ""items"":[ { ""itemId"":0, ""name"":""item0"" }, { ""itemId"":1, ""name"":""item1"" } ] }";
вы можете использовать два метода :
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(); }
в SplitLineToMultiline () вам нужно определить строку , которую вы хотите использовать, и длину строки, это очень просто . Спасибо.