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

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

5
задан Jim G. 18 June 2010 в 15:04
поделиться

9 ответов

Это не вопрос, что полезнее...

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

StringBuilder 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 раз.
3
ответ дан 18 December 2019 в 06:34
поделиться

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

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

Похожий вопрос? String против StringBuilder

7
ответ дан 18 December 2019 в 06:34
поделиться

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

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

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

0
ответ дан 18 December 2019 в 06:34
поделиться

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

11
ответ дан 18 December 2019 в 06:34
поделиться

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

См. Это : StringBuilder vs String

0
ответ дан 18 December 2019 в 06:34
поделиться

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

Console.WriteLine("MyString");

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

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

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

Он пишет:

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


1
ответ дан 18 December 2019 в 06:34
поделиться

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

Потому что если у вас есть (ссылка на) строку "Это строка", вы можете быть уверены, что она будет иметь одно и то же значение всегда. В то время как значение 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
0
ответ дан 18 December 2019 в 06:34
поделиться

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

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

0
ответ дан 18 December 2019 в 06:34
поделиться

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

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

2
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

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