Когда вы используете StringBuilder.AppendLine/строка.Формат противStringBuilder.Формат приложения?

StackOverflow https://stackoverflow.com/questions/349724

Вопрос

Недавний возник вопрос об использовании String.Форматирование().Часть моего ответа включала предложение использовать StringBuilder.AppendLine(строка.Формат (...)).Джон Скит предположил, что это плохой пример, и предложил использовать комбинацию AppendLine и AppendFormat.

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

sbuilder.AppendFormat("{0} line", "First").AppendLine();
sbuilder.AppendFormat("{0} line", "Second").AppendLine();

// as opposed to:

sbuilder.AppendLine( String.Format( "{0} line", "First"));
sbuilder.AppendLine( String.Format( "{0} line", "Second"));
Это было полезно?

Решение

Я рассматриваю AppendFormat за которым следует AppendLine как не только более читаемый, но и более производительный, чем вызов AppendLine(string.Format(...)).

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

Другие советы

Просто создайте метод расширения.

public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args)
{
    builder.AppendFormat(format, args).AppendLine();
    return builder;
}

Причины, по которым я предпочитаю это:

  • Не страдает от таких больших накладных расходов, как AppendLine(string.Format(...)), как указано выше.
  • Мешает мне забыть добавить .AppendLine() часть в конце (случается достаточно часто).
  • Является более читабельным (но это скорее мое мнение).

Если вам не нравится, что он называется "AppendLine", вы можете изменить его на "AppendFormattedLine" или как угодно еще.Тем не менее, мне нравится все, что связано с другими вызовами "AppendLine":

var builder = new StringBuilder();

builder
    .AppendLine("This is a test.")
    .AppendLine("This is a {0}.", "test");

Просто добавьте один из них для каждой используемой вами перегрузки метода AppendFormat в StringBuilder.

String.format создает внутренний объект StringBuilder.Делая

sbuilder.AppendLine( String.Format( "{0} line", "First"));

создается дополнительный экземпляр string builder со всеми его служебными данными.


Отражатель в mscorlib, Commonlauageruntimelibary, System.Строка.Формат

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();
}

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

Я обычно использую:

sbuilder.AppendFormat("{0} line", "First");
sbuilder.AppendLine();
sbuilder.AppendFormat("{0} line", "Second");
sbuilder.AppendLine();

Если производительность не критична, в этом случае я бы использовал:

sbuilder.Append("First");
sbuilder.AppendLine(" line");
sbuilder.Append("Second");
sbuilder.AppendLine(" line");

(Конечно, это имело бы больше смысла, если бы "Первый" и "Второй" были не строковыми литералами)

AppendFormat() намного удобочитаемее, чем AppendLine(строка.Format())

Я предпочитаю такую структуру:

sbuilder.AppendFormat("{0} line\n", "First");

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

Это просто ужасно - просто использовать

sbuilder.AppendFormat("{0} line\n", first);

?Я имею в виду, я знаю, что он не зависит от платформы или что-то в этом роде, но в 9 из 10 случаев он выполняет свою работу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top