Подтвердить что ты не робот

Разница между строкой и StringBuilder в С#

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

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

4b9b3361

Ответ 1

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

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

Если вам нужна изменчивая строка, например, которую вы производите по кусочкам или где вы меняете много вещей, вам понадобится 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(' ');
}

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

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

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 может это сделать и лучше не делать этого).

Ответ 2

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

String

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

Пример:

string str = "hi";
str += "hello"; // New string instance will be created, instead of changing the old one
str += "hw r u"; // Again new string instance will be created, instead of changing the old one

StringBuilder:

String builder изменен, это означает, что когда мы создаем объект строкового построителя, мы можем выполнять любую операцию, такую ​​как вставка, замена или добавление без создания нового экземпляра для каждого раза.

Пример:

StringBuilder sb = new StringBuilder("");
sb.Append("hi");
sb.Append("hello");
string str = sb.ToString();

Подробнее о "Различия между String и StringBuilder" в табличном формате с примером здесь.

Ответ 3

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

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

Ответ 4

String vs. StringBuilder

  • строка

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

    • Поточно-

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

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

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

Связанный вопрос: изменчивость строки, когда строка не изменяется в С#

Ответ 5

строка

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

StringBuilder

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

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

Ответ 6

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 будет использовать меньше памяти и будет работать быстрее. Вместо создания новой строки, которая является объединением двух, она создаст порции отдельно, и только в конце объединит их.

Ответ 7

Из Документация класса StringBuilder:

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

Ответ 8

Основное отличие:

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

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

Для примера кода я предлагаю вам посмотреть здесь:

Ответ 11

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

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

Microsoft поощряет использование StringBuilder, потому что он более эффективен с точки зрения использования памяти.

Ответ 12

Также сложность конкатенации String составляет O (N2), в то время как для StringBuffer это O (N).

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

Ответ 13

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

Ответ 14

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