Строка. Формат, столь же эффективный как StringBuilder

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

156
задан Ijas Ameenudeen 20 January 2019 в 13:57
поделиться

11 ответов

ПРИМЕЧАНИЕ: Этот ответ был записан, когда.NET 2.0 была текущей версией. Это больше не может относиться к более поздним версиям.

String.Format использование StringBuilder внутренне:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }

    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
    builder.AppendFormat(provider, format, args);
    return builder.ToString();
}

вышеупомянутый код является отрывком от mscorlib, таким образом, вопрос становится, "StringBuilder.Append() быстрее, чем StringBuilder.AppendFormat()"?

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

Этот парень, Jerry Dixon, сделал некоторое сравнительное тестирование:

http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm

Обновленный:

Печально ссылка выше с тех пор умерла. Однако существует все еще копия на Пути Обратная Машина:

http://web.archive.org/web/20090417100252/http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm

В конце дня это зависит, будет ли Ваше строковое форматирование названным повторяющимся образом, т.е. Вы переделываете некоторую серьезную обработку текста 100's мегабайтов текста, или называют ли это, когда пользователь нажимает кнопку время от времени. Если Вы не делаете некоторое огромное задание пакетной обработки, я придерживался бы Строки. Формат, это помогает удобочитаемости кода. Если Вы подозреваете, что узкое место перфекта тогда прикрепляет профилировщика на Ваш код и видит, где это действительно.

143
ответ дан Kev 23 November 2019 в 21:51
поделиться

Я предложил бы не, начиная со Строки. Формат не был разработан для конкатенации, это был дизайн для форматирования вывода различных исходных данных, таких как дата.

String s = String.Format("Today is {0:dd-MMM-yyyy}.", DateTime.Today);
-1
ответ дан zellus 23 November 2019 в 21:51
поделиться

В обоих случаях выше я хочу ввести одну или несколько строк в середину предопределенной шаблонной строки.

, В этом случае, я предложил бы Строку. Формат является самым быстрым, потому что это - дизайн для той точной цели.

0
ответ дан GateKiller 23 November 2019 в 21:51
поделиться

О, также самое быстрое было бы:

string cat = "cat";
string s = "The " + cat + " in the hat";
3
ответ дан Vaibhav 23 November 2019 в 21:51
поделиться

Это действительно зависит. Для маленьких строк с немногими конкатенациями это на самом деле быстрее только для добавления строк.

String s = "String A" + "String B";

, Но для большей строки (очень очень большие строки), тогда более эффективно использовать StringBuilder.

0
ответ дан Joseph Daigle 23 November 2019 в 21:51
поделиться

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

Несколько примечаний:

  • Формат является способом пойти для видимых пользователем строк в профессиональных приложениях; это избегает ошибок локализации
  • , Если Вы знаете длину результирующей строки заранее, используйте StringBuilder (Int32) конструктор для предопределения способности
10
ответ дан McDowell 23 November 2019 в 21:51
поделиться

Я выполнил некоторые быстрые сравнительные тесты производительности, и для 100 000 операций составил в среднем более чем 10 выполнений, первый метод (Строковый Разработчик) берет почти половину времени второго (Формат строки).

Так, если это является нечастым, это не имеет значения. Но если это - общая операция, тогда можно хотеть использовать первый метод.

12
ответ дан Vaibhav 23 November 2019 в 21:51
поделиться

От документация MSDN :

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

45
ответ дан Greg 23 November 2019 в 21:51
поделиться

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

я нашел, что, в случаях, где я создаю строки довольно линейным способом, или делаю прямые конкатенации или использую StringBuilder, Ваш наилучший вариант. Я предлагаю это в случаях, где большинство строки, которую Вы создаете, является динамичным. Так как очень мало текста статично, самая важная вещь состоит в том, что ясно, куда каждая часть динамического текста помещается в случае, если этому нужно обновленный в будущем.

, С другой стороны, если Вы говорите о большом блоке статического текста с двумя или тремя переменными в нем, даже если это немного менее эффективно, я думаю ясность, которую Вы получаете от строки. Формат делает его стоящим того. Я использовал это ранее на этой неделе, имея необходимость поместить один бит динамического текста в центре документа на 4 страницы. Будет легче обновить тот большой блок текста, если в одной части, чем необходимость обновить три части, которые Вы связываете вместе.

8
ответ дан saalon 23 November 2019 в 21:51
поделиться

String.Format использует StringBuilder внутри ... настолько логично, что это наводит на мысль, что он будет немного менее производительным из-за больших накладных расходов. Однако простая конкатенация строк - это самый быстрый способ внедрения одной строки между двумя другими ... в значительной степени. Это свидетельство было продемонстрировано Рико Мариани в его самой первой викторине, много лет назад. Простой факт заключается в том, что конкатенации ... когда известно количество частей строки (без ограничений ... вы можете объединить тысячу частей ... пока вы знаете, что это всегда 1000 частей) ... всегда быстрее, чем StringBuilder или String.Format. Они могут выполняться с одним выделением памяти или серией копий памяти. Вот доказательство

А вот фактический код для некоторых методов String.Concat,

6
ответ дан 23 November 2019 в 21:51
поделиться

Это действительно зависит от вашей схемы использования.
Подробный тест между string.Join , string, Concat и string.Format можно найти здесь: String.Format не подходит для интенсивного Ведение журнала

0
ответ дан 23 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: