Есть ли различия между этими примерами? Который я должен использовать, в этом случае?
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);
Существуют подобные вопросы:
+
оператор, и даже не упоминается в ответе, что это преобразовывается в Строку. ConcatЭтот вопрос спрашивает о том, что происходит в каждом случае, каков будет реальный вывод тех примеров? Каковы различия о них? Где я должен использовать их, в этом случае?
Собирая информацию из всех ответов, оказывается, что он ведет себя следующим образом:
Оператор +
такой же, как String.Concat
, его можно использовать на небольших конкатенации вне цикла, можно использовать для небольших задач.
Во время компиляции оператор +
генерирует одну строку, если они статические, а String.Concat
генерирует выражение str = str1 + str2;
] даже если они статичны.
String.Format
такой же, как StringBuilder ..
(пример 3), за исключением того, что String.Format
выполняет проверку параметров и создает экземпляр внутреннего StringBuilder
с длиной параметров.
String.Format
следует использовать, когда требуется строка формата, а также для объединения простых строк.
StringBuilder
следует использовать, когда вам нужно объединить большие строки или в цикл.
Пока вы не работаете с очень большим количеством (100+) строк или с очень большими (длина > 10000) строками, единственным критерием является читабельность.
Для проблем такого размера используйте +
. Эта перегрузка +
была добавлена в класс string для удобочитаемости.
Используйте string.Format()
для более сложных композиций и когда требуются подстановки или форматирование.
Используйте StringBuilder
при объединении многих частей (сотни или более) или очень больших частей (длина >> 1000). StringBuilder не обладает свойствами читабельности, он нужен только для производительности.
Используйте в своем сценарии оператор +.
Я бы использовал метод 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.
Мое практическое правило - использовать String.Format
, если вы выполняете относительно небольшой объем конкатенации (<100) и StringBuilder
] для случаев, когда объединение будет большим или потенциально большим. Я использую String.Join
, если у меня есть массив и не требуется никакого форматирования.
Вы также можете использовать функцию Aggregate в LINQ, если у вас есть перечислимая коллекция: http://msdn.microsoft.com/en-us/library/bb548651.aspx
@ Jerod Houghtelling Ответ
На самом деле String.Format использует StringBuilder «за кулисами» (если хотите, используйте «Reflecton» в String.Format)
Я согласен со следующим ответом в целом
@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);
var str3 = new StringBuilder
.AppendFormat("abc{0}{1}", dynamicString, dynamicString2).ToString();
код выше самый быстрый. так что используйте его, если хотите быстро. используйте любой другой, если вам все равно.
Важно понимать, что строки неизменяемы, они не меняются. Итак, ЛЮБОЙ раз, когда вы меняете, добавляете, модифицируете или что-то еще, строка создает новую «версию» строки в памяти, а затем передает старую версию для сборки мусора. Примерно так:
string output = firstName.ToUpper().ToLower() + "test";
Будет создана строка (для вывода), затем в памяти будут созданы ТРИ других строки (одна для: ToUpper (), ToLower () вывода, а затем одна для конкатенации " тестовое задание").
Итак, если вы не используете StringBuilder или string.Format, все, что вы делаете, создаст дополнительные экземпляры вашей строки в памяти. Это, конечно, проблема внутри цикла, когда вы можете получить сотни или тысячи дополнительных строк. Надеюсь, что это поможет
Важно помнить, что строки не ведут себя как обычные объекты. Возьмите следующий код:
string s3 = "Hello ";
string s3 += "World";
Этот фрагмент кода создаст новую строку в куче и поместит в нее «Hello». Ваш строковый объект в стеке будет указывать на него (как на обычный объект).
Строка 2 создаст в куче вторую строку «Hello World» и укажет на нее объект в стеке. Первоначальное выделение стека остается в силе до вызова сборщика мусора.
Итак ... если у вас есть загрузка этих вызовов до вызова сборщика мусора, вы можете тратить много памяти.