Многострочных строковых литералов в C#


есть ли простой способ создать многострочный строковый литерал в C#?

вот что у меня есть сейчас:

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

Я знаю, что PHP имеет

<<<BLOCK

BLOCK;

есть ли у C# что-то подобное?

10 752

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 StringBuilders,String.Joins или даже вложенные функции с реверсами строк, а что нет, заставляет меня думать, что люди на самом деле не понимают вопрос. Или, может быть, я этого не понимаю.

насколько я знаю, 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 () вам нужно определить строку , которую вы хотите использовать, и длину строки, это очень просто . Спасибо.