Разница между строкой и StringBuilder в C#
В чем разница между string
а также StringBuilder
?
Кроме того, что было бы несколько примеров для понимания?
13 ответов
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(' ');
}
Это должно значительно снизить нагрузку на распределитель памяти:-)
Однако следует отметить, что компилятор 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, и лучше не делать ставок на это).
String Vs StringBuilder
- строка
- в пространстве имен системы
- Неизменяемый (только для чтения) экземпляр
- производительность падает, когда происходит постоянное изменение значения
- потокобезопасный
- в пространстве имен System.Text
- изменчивый экземпляр
- показывает лучшую производительность, так как новые изменения сделаны в существующем экземпляре
Описательная статья на эту тему с множеством примеров использования ObjectIDGenerator, перейдите по этой ссылке
Связанный Stackeoverflow Вопрос: Изменчивость строки, когда строка не изменяется в C#?
Разница между String и StringBuilder?
Строка:
Строка неизменна. Неизменяемый означает, что после создания строкового объекта мы не можем его изменить. Любая операция, такая как вставка, замена или добавление, произошла, чтобы изменить строку, просто она отбросит старое значение и создаст новый экземпляр в памяти для хранения нового значения.
Пример:
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 является изменяемым, это означает, что как только мы создаем объект string string, мы можем выполнять любые операции, такие как вставка, замена или добавление, не создавая каждый раз новый экземпляр.
Пример:
StringBuilder sb = new StringBuilder("");
sb.Append("hi");
sb.Append("hello");
string str = sb.ToString();
Узнайте больше о "Различиях между String и StringBuilder" в табличном формате с примером здесь.
Строка является неизменной, что означает, что когда вы создаете строку, вы никогда не сможете ее изменить. Скорее, он создаст новую строку для хранения нового значения, и это может быть неэффективно, если вам нужно сильно изменить значение строковой переменной.
StringBuilder может использоваться для имитации изменяемой строки, поэтому он подходит для случаев, когда вам нужно сильно изменить строку.
String Экземпляр String является неизменным, то есть мы не можем изменить его после того, как он был создан. Если мы выполним какую-либо операцию со строкой, она вернет новый экземпляр (создаст новый экземпляр в памяти) вместо изменения существующего значения экземпляра.
StringBuilder StringBuilder является изменяемым, то есть если мы выполняем какую-либо операцию над StringBuilder, он обновит существующее значение экземпляра и не создаст новый экземпляр.
http://www.dotnetlearners.com/blogs/view/180/Difference-between-String-and-StringBuilder.aspx
Основное отличие:
Строка неизменна. Это означает, что вы не можете изменить строку вообще; Результатом модификации является новая строка. Это не эффективно, если вы планируете добавить к строке.
StringBuilder изменчив. Он может быть изменен любым способом и не требует создания нового экземпляра. Когда работа закончена, ToString() может быть вызван для получения строки.
Струны могут участвовать в интернировании. Это означает, что строки с одинаковым содержимым могут иметь одинаковые адреса. StringBuilder не может быть интернирован.
String - единственный класс, который может иметь ссылочный литерал.
Строки являются неизменяемыми, т. Е. Если вы измените его значение, старое значение будет отброшено, а новое значение будет создано в куче, тогда как в строителе строк мы можем изменить существующее значение без создания нового значения. Таким образом, String Builder с точки зрения производительности выгоден, так как нам не нужно занимать больше места в памяти.
Из документации класса StringBuilder:
Объект String является неизменным. Каждый раз, когда вы используете один из методов в классе System.String, вы создаете новый строковый объект в памяти, который требует нового выделения пространства для этого нового объекта. В ситуациях, когда вам необходимо выполнить повторные модификации строки, накладные расходы, связанные с созданием нового объекта String, могут быть дорогостоящими. Класс System.Text.StringBuilder можно использовать, когда вы хотите изменить строку без создания нового объекта. Например, использование класса StringBuilder может повысить производительность при объединении множества строк в цикле.
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 будет использовать меньше памяти и будет работать быстрее. Вместо создания новой строки, которая является объединением двух, она будет создавать фрагменты отдельно и только в конце объединит их.
Также сложность конкатенации String составляет O(N2), в то время как для StringBuffer это O(N).
Поэтому может возникнуть проблема с производительностью, когда мы используем конкатенации в циклах, так как каждый раз создается много новых объектов.
String (System.String) - это тип, определенный внутри платформы.NET. Класс String не является изменяемым. Это означает, что каждый раз, когда вы выполняете действие с экземпляром System.String, компилятор.NET создает новый экземпляр строки. Эта операция скрыта для разработчика.
System.Text.StringBuilder - это класс, который представляет изменяемую строку. Этот класс предоставляет несколько полезных методов, которые позволяют пользователю управлять строкой, обернутой StringBuilder. Обратите внимание, что все манипуляции выполняются в одном экземпляре StringBuilder.
Microsoft поощряет использование StringBuilder, потому что он более эффективен с точки зрения использования памяти.
Строка является неизменным типом. Это означает, что всякий раз, когда вы начинаете объединять строки друг с другом, вы каждый раз создаете новые строки. Если вы делаете это много раз, вы в конечном итоге получаете много кучи и риск нехватки памяти.
Экземпляр StringBuilder используется, чтобы иметь возможность добавлять строки в один и тот же экземпляр, создавая строку при вызове для него метода ToString.
Из-за накладных расходов на создание экземпляра объекта StringBuilder Microsoft заявляет, что его полезно использовать, когда у вас более 5-10 конкатенаций строк.
Для примера кода я предлагаю вам посмотреть здесь:
Система. String is Mutable объект означает, что не может быть изменен после его создания, пожалуйста, обратитесь к приведенному ниже URL для лучшего понимания
http://developer-insight.blogspot.com/2017/04/different-between-system.html
Вы можете использовать метод Clone, если хотите перебирать строки вместе со строителем строк. Он возвращает объект, чтобы вы могли преобразовать в строку, используя метод ToString...:)