Где строки более полезны, чем StringBuilder?

Уже было задано множество вопросов о различиях между построителем строк и построителем строк, и большинство людей полагают, что построитель строк работает быстрее, чем строка. Мне любопытно узнать, не слишком ли хорош построитель строк, так зачем там строка? Более того, может ли какой-нибудь орган дать мне пример, где строка будет более полезной, чем построитель строк?


person DJay    schedule 18.06.2010    source источник
comment
См. yoda.arachsys.com/csharp/stringbuilder.html.   -  person Martin Smith    schedule 18.06.2010
comment
joelonsoftware.com/articles/fog0000000319.html Joel On Software дает хорошее объяснение того, что на самом деле происходит, когда вы объединяете две строки. Статья посвящена C ++, но C # работает точно так же. Игнорируйте все, что находится внутри и ниже Как это исправить? раздел, поскольку эта часть специфична для C ++; в C # вы исправляете это, используя StringBuilder, который работает аналогично тому, как я могу исправить этот раздел.   -  person Brian    schedule 18.06.2010
comment
возможный дубликат String vs. StringBuilder   -  person nawfal    schedule 17.07.2014


Ответы (9)


Это не тот случай, который полезнее ...

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

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

Не делайте этого

string s = "my string";
s += " is now a little longer";

или

s = s + " is now longer again";

Это создаст в памяти 5 строк (на самом деле, см. Ниже).

Сделай это:

StringBuilder sb = new StringBuilder();
sb.Append("my string");
sb.Append(" is now a little longer");
sb.Append(" is now longer again");
string s = sb.ToString();

Это создаст в памяти 1 строку (опять же, см. Ниже).

Ты можешь сделать это:

string s = "It is now " + DateTime.Now + ".";

Это создает в памяти только 1 строку.

Кстати, создание StringBuilder в любом случае требует определенного количества памяти. Примерное практическое правило:

  • Всегда используйте StringBuilder, если вы объединяете строки в цикл.
  • Используйте StringBuilder, если вы объединяете строку более 4 раз.
person David Neale    schedule 18.06.2010
comment
string.Concat также является жизнеспособным решением для вашего примера. string s = string.Concat("my string", "is now a little longer", "is now longer again"); - person KP.; 18.06.2010

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

person Janick Bernet    schedule 18.06.2010

StringBuilder - лучший вариант при создании и изменении строк с помощью тяжелых циклов или итераций.

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

Аналогичный вопрос? String против StringBuilder

person KP.    schedule 18.06.2010

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

Если мне нужно использовать одно и то же строковое значение в 10 местах, я использую String. Если мне нужно изменить его 10 раз, StringBuilder.

person Rox    schedule 18.06.2010

Вы действительно использовали бы здесь конструктор строк?

Console.WriteLine("MyString");

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

У Джона Скита есть отличная статья по этому поводу: http://www.yoda.arachsys.com/csharp/stringbuilder.html

Ознакомьтесь с разделом, который начинается со слов «Итак, я должен использовать StringBuilder везде, верно?»

Он пишет:

Важное различие между этим примером и предыдущим заключается в том, что мы можем легко представить все строки, которые необходимо объединить вместе, за один вызов String.Concat. Это означает, что никаких промежуточных строк не требуется. StringBuilder эффективен в первом примере, потому что он действует как контейнер для промежуточного результата без необходимости каждый раз копировать этот результат - в любом случае, когда промежуточного результата нет, у него нет преимущества.


person brendan    schedule 18.06.2010

Короче говоря, это компромисс между изменяемым и неизменным.

См. Это: StringBuilder vs String

person rhapsodyn    schedule 18.06.2010

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

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

Одним из реальных преимуществ StringBuilder перед строкой является то, что вы можете передавать его через несколько методов и добавлять строки по пути. Вы не можете сделать это, передав строковый объект. Итак, если у вас есть рекурсивная операция, в которой вы создаете объект JSON или что-то в этом роде, вы можете передать StringBuilder и добавить значения.

person kemiller2002    schedule 18.06.2010

Строка хороша тем, что неизменна. И то, что неизменность - это хорошо, это то, что функциональные языки доказывают.

Потому что, если у вас есть (ссылка на) строку «Это строка», вы можете быть уверены, что она всегда будет иметь одно и то же значение. Хотя значение StringBuilder может быть изменено (вызовом метода, другим потоком и т. Д.).

Но иногда вам нужна чистая чистая оптимизация скорости и использования памяти. В этом случае вы используете конструктор строк.

Пример:

 var a = "This is a string";
 var b = a;
 a += ". And some part is added";   // a now references another string in memory

 var aSB = new StringBuilder("This is a string");
 var bSB = aSB
 aSB.Append(". And some part is added"); // aSB and bSB still reference the same memory spot

 Console.WriteLine(b);   // ==> This is a string
 Console.WriteLine(bSB); // ==> This is a string. And some part is added
person GvS    schedule 18.06.2010

Анализ того, что использовать, представлен по адресу: Эффективное объединение строк.

По сути (хотя прочтите ссылку для полного анализа), используйте StringBuilder при конкатенации в нетривиальном цикле.

person David_001    schedule 18.06.2010