Партию вопросов уже спросили о различиях между строковым и строковым разработчиком, и большинство людей предполагает, что строковый разработчик быстрее, чем строка. Мне любопытно знать, слишком ли строковый разработчик хорош итак, почему строка там? Кроме того, некоторое тело может дать мне пример, где строка будет более полезной, чем строковый разработчик?
Это не вопрос, что полезнее...
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 раз. StringBuilder - лучший вариант при создании и изменении строк с помощью сложных циклов или итераций.
Простые строковые операции, такие как несколько конкатенаций или простое сохранение строкового значения, намного лучше подходят для стандартного строкового объекта.
Похожий вопрос? String против StringBuilder
StringBuilder не быстрее, чем использование строки, поскольку просто создает строку.
StringBuilder может работать быстрее, если вам нужно объединить несколько строк (как в цикле). Вы собираетесь заплатить штраф за производительность, когда вам нужно преобразовать содержимое построителя строк в строку.
Одним из реальных преимуществ StringBuilder перед строкой является то, что вы можете передавать его через несколько методов и по ходу добавлять строки. Вы не можете сделать это, передав строковый объект. Поэтому, если у вас есть рекурсивная операция, в которой вы создаете объект JSON или что-то в этом роде, вы можете передать StringBuilder и добавить значения.
StringBuilder, как следует из его названия, используется для построения строк, в то время как строки - это неизменяемые символьные значения. Используйте строки, когда вы хотите передавать символьные данные, используйте StringBuilder, когда вы хотите манипулировать символьными данными.
Короче говоря, это компромисс между изменяемым и неизменяемым
См. Это : StringBuilder vs String
Вы действительно используете здесь построитель строк?
Console.WriteLine("MyString");
StringBuilder отлично подходит, когда вам нужно выполнить большое количество конкатенации для построения строки.
У Джона Скита есть отличная статья по этому поводу: http://www.yoda.arachsys.com/csharp/stringbuilder.html
Ознакомьтесь с разделом, который начинается с «Итак, я должен использовать StringBuilder везде, Верно? »
Он пишет:
Важное различие между этим пример и предыдущий, что мы можем легко представить все строки которые нужно объединить вместе за один вызов String.Concat. Что означает, что промежуточные строки не нужный. StringBuilder эффективен в первый пример, потому что он действует как контейнер для промежуточного результата без необходимости копировать этот результат каждый раз - когда нет промежуточный результат так или иначе, у него нет преимущество.
Строка хороша тем, что она неизменяема. А то, что неизменяемость - это хорошо, это то, что доказывают функциональные языки.
Потому что если у вас есть (ссылка на) строку "Это строка", вы можете быть уверены, что она будет иметь одно и то же значение всегда. В то время как значение 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
Анализ того, что следует использовать, приведен в: Эффективная конкатенация строк.
По существу (хотя для полного анализа читайте ссылку), используйте StringBuilder
при конкатенации в нетривиальном цикле.
StringBuilder лучше, когда вам нужно изменить значение. В противном случае в этом нет необходимости.
Если мне нужно использовать одно и то же строковое значение в 10 местах, я использую String. Если мне нужно изменить его 10 раз, StringBuilder.