Уже было задано множество вопросов о различиях между построителем строк и построителем строк, и большинство людей полагают, что построитель строк работает быстрее, чем строка. Мне любопытно узнать, не слишком ли хорош построитель строк, так зачем там строка? Более того, может ли какой-нибудь орган дать мне пример, где строка будет более полезной, чем построитель строк?
Где строки более полезны, чем StringBuilder?
Ответы (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 раз.
string s = string.Concat("my string", "is now a little longer", "is now longer again");
- person KP.; 18.06.2010
StringBuilder, как следует из названия, используется для построения строк, тогда как строки являются неизменяемыми символьными значениями. Используйте строки, когда вы хотите передать символьные данные, используйте StringBuilder, когда вы хотите манипулировать символьными данными.
StringBuilder - лучший вариант при создании и изменении строк с помощью тяжелых циклов или итераций.
Простые строковые операции, такие как несколько конкатенаций или простое сохранение строкового значения, намного лучше подходят для стандартного строкового объекта.
Аналогичный вопрос? String против StringBuilder
StringBuilder лучше, когда вам нужно изменить значение. В противном случае в этом нет необходимости.
Если мне нужно использовать одно и то же строковое значение в 10 местах, я использую String. Если мне нужно изменить его 10 раз, StringBuilder.
Вы действительно использовали бы здесь конструктор строк?
Console.WriteLine("MyString");
StringBuilder отлично подходит, когда вам нужно выполнить большое количество конкатенации для построения строки.
У Джона Скита есть отличная статья по этому поводу: http://www.yoda.arachsys.com/csharp/stringbuilder.html
Ознакомьтесь с разделом, который начинается со слов «Итак, я должен использовать StringBuilder везде, верно?»
Он пишет:
Важное различие между этим примером и предыдущим заключается в том, что мы можем легко представить все строки, которые необходимо объединить вместе, за один вызов String.Concat. Это означает, что никаких промежуточных строк не требуется. StringBuilder эффективен в первом примере, потому что он действует как контейнер для промежуточного результата без необходимости каждый раз копировать этот результат - в любом случае, когда промежуточного результата нет, у него нет преимущества.
Короче говоря, это компромисс между изменяемым и неизменным.
См. Это: StringBuilder vs String
StringBuilder не быстрее, чем использование строки, поскольку просто создает строку.
StringBuilder может быть быстрее, если вам нужно объединить несколько строк (например, в цикле). Вы собираетесь заплатить штраф за производительность, когда вам нужно преобразовать содержимое построителя строк в строку.
Одним из реальных преимуществ StringBuilder перед строкой является то, что вы можете передавать его через несколько методов и добавлять строки по пути. Вы не можете сделать это, передав строковый объект. Итак, если у вас есть рекурсивная операция, в которой вы создаете объект JSON или что-то в этом роде, вы можете передать StringBuilder и добавить значения.
Строка хороша тем, что неизменна. И то, что неизменность - это хорошо, это то, что функциональные языки доказывают.
Потому что, если у вас есть (ссылка на) строку «Это строка», вы можете быть уверены, что она всегда будет иметь одно и то же значение. Хотя значение 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
Анализ того, что использовать, представлен по адресу: Эффективное объединение строк.
По сути (хотя прочтите ссылку для полного анализа), используйте StringBuilder
при конкатенации в нетривиальном цикле.
StringBuilder
, который работает аналогично тому, как я могу исправить этот раздел. - person Brian   schedule 18.06.2010