Лучший способ разбить длинные строки в исходном коде C # - PullRequest
35 голосов
/ 12 ноября 2008

Мне интересно, какова "лучшая практика" разбивать длинные строки в исходном коде C #. Эта строка

"string1"+
"string2"+
"string3"

объединены во время компиляции или во время выполнения?

Ответы [ 10 ]

50 голосов
/ 12 ноября 2008

Это делается во время компиляции. Это в точности эквивалентно "string1string2string3".

Предположим, у вас есть:

string x = "string1string2string3"
string y = "string1" + "string2" + "string3"

Компилятор выполнит соответствующее интернирование, чтобы x и y ссылались на одни и те же объекты.

РЕДАКТИРОВАТЬ: есть много разговоров о StringBuilder в ответах и ​​комментариях. Многие разработчики считают, что конкатенация строк должна всегда выполняться с StringBuilder. Это чрезмерное обобщение - стоит понять , почему StringBuilder хорош в одних ситуациях, а не в других .

39 голосов
/ 12 ноября 2008

Если пробел не важен, вы можете использовать символ @ escape для написания многострочных строк в вашем коде. Это полезно, если у вас есть запрос в вашем коде, например:

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";

Это даст вам строку с разрывами строк и табуляцией, но для запроса, который не имеет значения.

7 голосов
/ 12 ноября 2008

Ваш пример будет объединен во время компиляции. Все строковые и константные строковые переменные объединяются во время компиляции.

Следует иметь в виду, что включение любых строк, доступных только для чтения, приведет к задержке преобразования во время выполнения. string.Empty и Environment.NewLine являются строковыми переменными только для чтения.

3 голосов
/ 12 ноября 2008

Конкатенация выполняется во время компиляции, поэтому нет никаких накладных расходов времени выполнения.

1 голос
/ 12 ноября 2008

StringBuilder - хороший способ, если у вас их много (более четырех) Строки для объединения. Это быстрее.

Использование String.Concat в приведенном выше примере выполняется во время компиляции. Поскольку они являются литеральными строками, они оптимизируются компилятором.

Если вы используете переменные:

string a = "string1";
string b = "string2";
string c = a + b;

Это делается во время выполнения.

1 голос
/ 12 ноября 2008

это действительно зависит от того, что вам нужно. Как правило, если вам нужно объединить строки, наилучшая производительность во время выполнения будет достигнута при использовании StringBuilder. Если вы ссылаетесь в исходном коде на что-то вроде var str = "String1" + "String2", он будет преобразован в строку str = "String1String2" при компиляции. В этом случае у вас нет накладных расходов на конкатенацию

0 голосов
/ 30 декабря 2018

Как насчет следующего метода расширения (который основан на общих тегах oneLine метод) ...

using System;
using System.Text.RegularExpressions;
using static System.Text.RegularExpressions.RegexOptions;

namespace My.Name.Space
{
    public static class StringHelper
    {
        public static string AsOneLine(this string text, string separator = " ")
        {
            return new Regex(@"(?:\n(?:\s*))+").Replace(text, separator).Trim();
        }
    }
}

... в сочетании с буквенным строковым литералом , используемым как таковой:

var mySingleLineText = @"
    If we wish to count lines of code, we should not regard them
    as 'lines produced' but as 'lines spent'.
".AsOneLine();

Обратите внимание, что пробелы "внутри" строки остаются неизменными, например:

// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();

Если вы не хотите, чтобы символы новой строки заменялись пробелами, тогда передайте "" в качестве аргумента методу расширения:

// foobar
var mySingleLineText = @"
    foo
    bar
".AsOneLine("");

Обратите внимание: Эта форма конкатенации строк выполняется во время выполнения благодаря задействованному вспомогательному методу (в отличие от конкатенации через оператор +, возникающей во время компиляции, как также указано в принят ответ). Так что, если производительность является проблемой, используйте +. Если вы имеете дело с длинными фразами и читаемостью, а «простота использования» - в центре внимания, то, возможно, стоит рассмотреть предложенный выше подход.

0 голосов
/ 13 апреля 2009

Есть способ сделать это. Мой фаворит использует строковый метод из C #. Образец первый:

string s = string.Format ("{0} {1} {0}", "Hello", "By"); результат s = "Hello By Hello";

0 голосов
/ 12 ноября 2008

StringBuilder будет вашим самым быстрым подходом, если вы используете любое количество строк.

http://dotnetperls.com/Content/StringBuilder-1.aspx

Если вы просто делаете несколько строк (5 или меньше - хорошее правило), скорость не будет зависеть от того, какую конкатенацию вы используете.

0 голосов
/ 12 ноября 2008

Не можете ли вы использовать StringBuilder?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...