Как я должен конкатенировать строки?
Существуют ли различия между этими примерами? Что я должен использовать в этом случае?
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
- Какой лучший метод конкатенации строк, который на самом деле не связан с моим вопросом, где он просит лучшего, а не сопоставлением возможных способов конкатенации строка и их выходы, как это делает этот вопрос.
Этот вопрос задает вопрос о том, что происходит в каждом случае, каков будет реальный вывод этих примеров? Каковы различия в них? Где я должен использовать их в этом случае?
Ответы
Ответ 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();
приведенный выше код является самым быстрым. поэтому используйте, если хотите быстро. используйте что-нибудь еще, если вы не заботитесь.