Разница между строкой и StringBuilder в C # - PullRequest
68 голосов
/ 18 июня 2010

В чем разница между string и StringBuilder?

Кроме того, что может быть примером для понимания?

Ответы [ 13 ]

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

A string экземпляр является неизменным.Вы не можете изменить его после того, как он был создан.Любая операция, которая, кажется, изменяет строку, вместо этого возвращает новый экземпляр:

string foo = "Foo";
// returns a new string instance instead of changing the old one
string bar = foo.Replace('o', 'a');
string baz = foo + "bar"; // ditto here

Неизменяемые объекты имеют некоторые хорошие свойства, такие как их можно использовать в потоках, не опасаясь проблем с синхронизацией, или что вы можете просто раздать свойзакрытые поля поддержки напрямую, не опасаясь, что кто-то изменяет объекты, которые он не должен изменять (см. массивы или изменяемые списки, которые часто необходимо скопировать перед возвратом, если это нежелательно).Но при неосторожном использовании они могут создавать серьезные проблемы с производительностью (как почти все - если вам нужен пример из языка, который гордится скоростью выполнения, тогда посмотрите на функции манипулирования строками в Си).

Когда вам нужен изменяемая строка, такая как та, которую вы строите по частям или где вы меняете много вещей, тогда вам понадобится StringBuilder, который представляет собой буфер символов, который может бытьизменилось.По большей части это влияет на производительность.Если вам нужна изменяемая строка и вместо этого вы делаете это с обычным экземпляром string, то в конечном итоге вы создадите и уничтожите множество объектов без необходимости, тогда как сам экземпляр StringBuilder изменится, что устранит необходимость во многих новых объектах.

Простой пример: следующее заставит многих программистов съежиться от боли:

string s = string.Empty;
for (i = 0; i < 1000; i++) {
  s += i.ToString() + " ";
}

В итоге вы создадите 2001 строк, 2000 из которых отброшены.Тот же пример с использованием StringBuilder:

StringBuilder sb = new StringBuilder();
for (i = 0; i < 1000; i++) {
  sb.Append(i);
  sb.Append(' ');
}

Это должно значительно снизить нагрузку на распределитель памяти: -)

Однако следует отметить, что компилятор C # достаточно умен, когда он появляется.в строки.Например, следующая строка

string foo = "abc" + "def" + "efg" + "hij";

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

string foo = a + b + c + d + e + f;

, будут переписаны в

string foo = string.Concat(a, b, c, d, e, f);

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

6 голосов
/ 13 февраля 2015

String vs. StringBuilder

  • String

    • В пространстве имен системы
    • Неизменяемый (только для чтения) экземпляр
    • Производительность ухудшается, когда происходит непрерывное изменение значения

    • Поточно-ориентированный

  • StringBuilder (изменяемая строка)

    1. В пространстве имен System.Text
    2. Изменяемый экземпляр
    3. Показывает лучшую производительность, так как новые изменения вносятся в существующий экземпляр

Для описательной статьи на эту тему с большим количеством примеров использования ObjectIDGenerator , перейдите по этой ссылке .

Вопрос по переполнению стека: Изменчивость строки, когда строка не изменяется в C #

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

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

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

3 голосов
/ 06 ноября 2015

Строка

Экземпляр String является неизменным, то есть мы не можем изменить его после того, как он был создан. Если мы выполним какую-либо операцию со строкой, она вернет новый экземпляр (создаст новый экземпляр в памяти) вместо изменения существующего значения экземпляра.

StringBuilder

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

Разница между String и StringBuilder

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

Из документации StringBuilder Class :

Объект String является неизменным.Каждый раз, когда вы используете один из методов в классе System.String, вы создаете новый строковый объект в памяти, который требует нового выделения пространства для этого нового объекта.В ситуациях, когда необходимо выполнить повторные изменения строки, накладные расходы, связанные с созданием нового объекта String, могут быть дорогостоящими.Класс System.Text.StringBuilder можно использовать, когда вы хотите изменить строку без создания нового объекта.Например, использование класса StringBuilder может повысить производительность при объединении множества строк в цикле.

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

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

Вместо этого:

String x = "";
x += "first ";
x += "second ";
x += "third ";

вы делаете

StringBuilder sb = new StringBuilder("");
sb.Append("first ");
sb.Append("second ");
sb.Append("third");
String x = sb.ToString();

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

1 голос
/ 01 января 2015

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

Таким образом, String Builder выгоден с точки зрения производительности, поскольку нам не нужно занимать больше места в памяти.

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

Значительная разница:

Строка неизменна.Это означает, что вы не можете изменить строку вообще;Результатом модификации является новая строка.Это не эффективно, если вы планируете добавить строку.

StringBuilder является изменяемым.Он может быть изменен любым способом и не требует создания нового экземпляра.Когда работа закончена, ToString () может быть вызван для получения строки.

Строки могут участвовать в интернировании.Это означает, что строки с одинаковым содержимым могут иметь одинаковые адреса.StringBuilder не может быть интернирован.

String - единственный класс, который может иметь ссылочный литерал.

0 голосов
/ 19 апреля 2017

System.String является изменяемым объектом, то есть его нельзя изменить после его создания. Пожалуйста, обратитесь к Разница между строкой и StringBuilder в C #? для лучшего понимания.

0 голосов
/ 12 июля 2013

Вы можете использовать метод Clone, если хотите перебирать строки вместе со строителем строк ... Он возвращает объект, чтобы вы могли преобразовать в строку с помощью метода ToString ...:)

...