Где строки более полезны, чем StringBuilder? - PullRequest
5 голосов
/ 18 июня 2010

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

Ответы [ 9 ]

11 голосов
/ 18 июня 2010

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

7 голосов
/ 18 июня 2010

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

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

Подобный вопрос? String vs. StringBuilder

3 голосов
/ 18 июня 2010

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

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

A 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 раз.
2 голосов
/ 18 июня 2010

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

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

1 голос
/ 18 июня 2010

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

Console.WriteLine("MyString");

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

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

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

Он пишет:

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


0 голосов
/ 18 июня 2010

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

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

0 голосов
/ 18 июня 2010

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

См. Это: StringBuilder vs String

0 голосов
/ 18 июня 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
0 голосов
/ 18 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...