Многострочный строковый литерал в 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!";
еще один gotcha, чтобы следить за использованием строковых литералов в строке.Формат. В этом случае вам нужно избежать фигурных скобок/скобок " {"и"}".
// 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>";
почему люди продолжают путать строки со строковыми литералами? Принятый ответ-отличный ответ на другой вопрос, но не на этот.
Я знаю, что это старая тема, но я пришел сюда, возможно, с тем же вопросом, что и оп, и это расстраивает, как люди продолжают неправильно его читать. Или, может быть, я неправильно понял, не знаю.
грубо говоря, строка-это область памяти компьютера, которая во время выполнения программы содержит последовательность байты, которые могут быть сопоставлены с текстовыми символами. С другой стороны, строковый литерал-это фрагмент исходного кода, еще не скомпилированный, который представляет значение, используемое для инициализации строки позже, во время выполнения программы, в которой она появляется.
В C#, заявление...
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
... не создайте трехстрочную строку, но одну строку; конкатенация трех строк (каждая инициализируется из другого литерала), ни одна из которых не содержит модификатор новой строки.
то, что OP, кажется, спрашивает -по крайней мере, то, что я хотел бы спросить с этими словами, - это не то, как ввести в скомпилированную строку разрывы строк, которые имитируют найденные в исходном коде, но как разбить для ясности длинную единственную строку текста в исходном коде без введение разрывов в скомпилированной строке. И не требуя длительного времени выполнения, потраченного на объединение нескольких подстрок, поступающих из исходного кода. Как конечные обратные косые черты внутри многострочного строкового литерала в 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 () вам нужно определить строку , которую вы хотите использовать, и длину строки, это очень просто . Спасибо.