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

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

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);

Существуют подобные вопросы:

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

17
задан Community 23 May 2017 в 12:32
поделиться

9 ответов

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

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

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

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

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

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

8
ответ дан 30 November 2019 в 12:19
поделиться

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

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

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

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

16
ответ дан 30 November 2019 в 12:19
поделиться

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

Я бы использовал метод 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.

5
ответ дан 30 November 2019 в 12:19
поделиться

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

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

2
ответ дан 30 November 2019 в 12:19
поделиться

@ Jerod Houghtelling Ответ

На самом деле String.Format использует StringBuilder «за кулисами» (если хотите, используйте «Reflecton» в String.Format)

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

1
ответ дан 30 November 2019 в 12:19
поделиться

@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);
1
ответ дан 30 November 2019 в 12:19
поделиться
var str3 = new StringBuilder
    .AppendFormat("abc{0}{1}", dynamicString, dynamicString2).ToString(); 

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

-1
ответ дан 30 November 2019 в 12:19
поделиться

Важно понимать, что строки неизменяемы, они не меняются. Итак, ЛЮБОЙ раз, когда вы меняете, добавляете, модифицируете или что-то еще, строка создает новую «версию» строки в памяти, а затем передает старую версию для сборки мусора. Примерно так:

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

Будет создана строка (для вывода), затем в памяти будут созданы ТРИ других строки (одна для: ToUpper (), ToLower () вывода, а затем одна для конкатенации " тестовое задание").

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

0
ответ дан 30 November 2019 в 12:19
поделиться

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

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

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

Строка 2 создаст в куче вторую строку «Hello World» и укажет на нее объект в стеке. Первоначальное выделение стека остается в силе до вызова сборщика мусора.

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

0
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: