Подтвердить что ты не робот

Как я должен конкатенировать строки?

Существуют ли различия между этими примерами? Что я должен использовать в этом случае?

var str1 = "abc" + dynamicString + dynamicString2;

var str2 = String.Format("abc{0}{1}", dynamicString, dynamicString2);

var str3 = new StringBuilder("abc").
    Append(dynamicString).
    Append(dynamicString2).
    ToString();

var str4 = String.Concat("abc", dynamicString, dynamicString2);

Есть похожие вопросы:

  • Разница в конкатенации строк, которая только спрашивает об операторе +, и даже не упоминается в ответе, что он преобразован в String.Concat
  • Какой лучший метод конкатенации строк, который на самом деле не связан с моим вопросом, где он просит лучшего, а не сопоставлением возможных способов конкатенации строка и их выходы, как это делает этот вопрос.

Этот вопрос задает вопрос о том, что происходит в каждом случае, каков будет реальный вывод этих примеров? Каковы различия в них? Где я должен использовать их в этом случае?

4b9b3361

Ответ 1

Собирая информацию из всех ответов, она выглядит так:

Оператор + совпадает с оператором String.Concat, который может использоваться для небольших конкатенаций вне цикла, может использоваться для небольших задач.

Во время компиляции оператор + генерирует одну строку, если они являются статическими, а String.Concat генерирует выражение str = str1 + str2;, даже если они являются статическими.

String.Format совпадает с StringBuilder.. (пример 3), за исключением того, что String.Format выполняет проверку параметров и создает интервал StringBuilder с длиной параметров.

String.Format следует использовать, когда требуется строка форматирования, и для простых простых строк.

StringBuilder следует использовать, когда вам нужно конкатенировать большие строки или в цикле.

Ответ 2

Пока вы не используете слишком много (100+) строк или с очень большими (длиной > 10000) строками, единственным критерием является читаемость.

Для проблем такого размера используйте +. Эта перегрузка + была добавлена ​​в класс строк для удобочитаемости.

Используйте string.Format() для более сложных композиций и когда требуются замены или форматирование.

Используйте StringBuilder при объединении многих частей (сотни или более) или очень больших частей (длина → 1000). У StringBuilder нет возможностей для чтения, это просто для производительности.

Ответ 3

Используйте оператор + в своем сценарии.

Я бы использовал метод String.Format(), когда у вас есть сочетание переменных и статических данных для хранения в вашей строке. Например:

string result=String.Format(
    "Today {0} scored {1} {2} and {3} points against {4}",..);

//looks nicer than
string result = "Today " + playerName + " scored " + goalCount + " " + 
    scoreType + " and " + pointCount + " against " + opposingTeam;

Я не вижу смысла использовать StringBuilder, так как вы уже имеете дело с тремя строковыми литералами.

Я лично использую Concat только при работе с массивом String.

Ответ 4

Мое правило состоит в том, чтобы использовать String.Format, если вы делаете относительно небольшое количество конкатенаций (< 100) и StringBuilder в моменты, когда конкатенация будет большой или потенциально будет большой. Я использую String.Join, если у меня есть массив, и нет необходимости в форматировании.

Вы также можете использовать функцию Aggregate в LINQ, если у вас есть перечислимая коллекция: http://msdn.microsoft.com/en-us/library/bb548651.aspx

Ответ 5

@Jerod Houghtelling Отвечать

Фактически String.Format использует StringBuilder за кулисами (используйте refon on String.Format, если хотите)

Я согласен со следующим ответом вообще

Ответ 6

@Xander. Я верю тебе, человек. Однако мой код показывает, что sb быстрее, чем string.format.

Убейте это:

Stopwatch sw = new Stopwatch();
sw.Start();

for (int i = 0; i < 10000; i++)
{
    string r = string.Format("ABC{0}{1}{2}", i, i-10, 
        "dasdkadlkdjakdljadlkjdlkadjalkdj");
}

sw.Stop();
Console.WriteLine("string.format: " + sw.ElapsedTicks);

sw.Reset();
sw.Start();
for (int i = 0; i < 10000; i++)
{
    StringBuilder sb = new StringBuilder();
    string r = sb.AppendFormat("ABC{0}{1}{2}", i, i - 10,
        "dasdkadlkdjakdljadlkjdlkadjalkdj").ToString();
}

sw.Stop();
Console.WriteLine("AppendFormat: " + sw.ElapsedTicks);

Ответ 7

Важно понимать, что строки неизменяемы, они не меняются. Таким образом, в любое время, когда вы меняете, добавляете, изменяете или что-то вроде строки, он собирается создать новую "версию" строки в памяти, а затем предоставить старую версию для сбора мусора. Так что-то вроде этого:

string output = firstName.ToUpper().ToLower() + "test";

Это создаст строку (для вывода), затем создадим еще три строки в памяти (один для: ToUpper(), ToLower(), а затем один для конкатенации "test" ).

Поэтому, если вы не используете StringBuilder или string.Format, все, что вы делаете, это создание дополнительных экземпляров вашей строки в памяти. Это, конечно, проблема внутри цикла, где вы можете получить сотни или тысячи дополнительных строк. Надеюсь, что поможет

Ответ 8

Важно помнить, что строки не ведут себя как обычные объекты. Возьмите следующий код:

string s3 = "Hello ";
string s3 += "World";

Этот фрагмент кода создаст новую строку в куче и поместит в нее "Hello". Затем ваш строковый объект в стеке укажет на него (как обычный объект).

Строка 2 затем создаст вторую строку в куче "Hello World" и укажет на нее объект в стеке. Начальное распределение стека сохраняется до тех пор, пока не вызывается сборщик мусора.

Итак... если у вас есть нагрузка этих вызовов до того, как вызывается сборщик мусора, вы можете тратить много памяти.

Ответ 9

var str3 = new StringBuilder
    .AppendFormat("abc{0}{1}", dynamicString, dynamicString2).ToString(); 

приведенный выше код является самым быстрым. поэтому используйте, если хотите быстро. используйте что-нибудь еще, если вы не заботитесь.