TGViewer
yet another dev yet another dev @yet_another_dev · 382 subscribers
Post #191 536
StringBuilder: избегайте ToString при использовании Append

Read on website.
Читать на сайте.

Это новая часть серии, в которой я разбираю правила качества кода .NET с точки зрения производительности. Сегодня поговорим про CA1830: Prefer strongly-typed Append and Insert method overloads on StringBuilder.

Описание правила

Правило рекомендует не преобразовывать значения в строку при вызове методов Append или Insert.

var i = 123;
var sb = new StringBuilder();
sb.Append(i.ToString()); // CA1830


Вместо этого лучше передать значение напрямую:

var i = 123;
var sb = new StringBuilder();
sb.Append(i);


Это правило касается примитивных типов вроде byte, short, int, double, long и других.

Анализ производительности

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

Разница по времени — небольшая: около 5 микросекунд на моём ноутбуке. Разница по памяти более заметная: около 20 кБ.

Как работает эта оптимизация?

Когда вы используете метод Append(int), под капотом StringBuilder вызываются методы AppendSpanFormattable<T> и InsertSpanFormattable<T>.

Например, упрощённая версия AppendSpanFormattable<T> выглядит так:

private StringBuilder AppendSpanFormattable<T>(T value) where T : ISpanFormattable
{
if (value.TryFormat(
RemainingCurrentChunk,
out int charsWritten,
format: default,
provider: null))
{
m_ChunkLength += charsWritten;
return this;
}

return Append(value.ToString());
}


Этот метод использует интерфейс ISpanFormattable.TryFormat, чтобы записать значение напрямую во внутренний буфер StringBuilder как Span<char>. Это позволяет: избежать аллокации строки; упаковки (boxing) и вызова виртуального метода ToString().

Стоит ли заморачиваться?

Скорее да. Даже если не брать в расчёт прирост производительности, такой код:

sb.Append(i);


и выглядит проще и чище, чем:

sb.Append(i.ToString());


И в качестве бонуса, он работает быстрее и потребляет меньше памяти. Win-win.
  • 👍 9
More from @yet_another_dev
  1. Sep 21, 2026Опубликовал вчера ролик в одной запрещённой в России соцсети про то, как сходил на выборы.…
  2. Sep 20, 2026Мы пришли в 7:50 и очередь уже была 🥲 Пообщались с другими людьми. Многие приехали из дру…
  3. Sep 19, 2026Post #383
  4. Sep 18, 2026Последние пару недель на чат нападают боты со спамом (прикрыл стикером). Поэтому чат тепер…
  5. Sep 17, 2026Что интересного в этой статье: 1. Потрачено $120К, а агенты суммарно отработали около 3-х…
  6. Sep 17, 2026В Microsoft переписали рантайм GitHub Copilot с TypeScript на Rust при помощи агентов. Под…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →