Разница между string и StringBuilder в C#

string и StringBuilder в C# используются для работы с текстовыми данными, но имеют разные механизмы управления памятью и производительностью.

string – неизменяемый тип

string – это неизменяемый (immutable) тип. Любая операция, изменяющая строку, создаёт новую строку в памяти.

string text = "Hello";
text += " World"; // Создается новая строка, а старая остается в памяти
Console.WriteLine(text); // Hello World

При частом изменении строк string может вызывать излишнюю нагрузку на память.

StringBuilder – изменяемый тип

StringBuilder – это изменяемый (mutable) класс для работы со строками, позволяющий изменять содержимое без создания новых объектов в памяти.

using System.Text;

StringBuilder sb = new StringBuilder("Hello");
sb.Append(" World");
Console.WriteLine(sb.ToString()); // Hello World

В отличие от string, StringBuilder изменяет уже существующую строку, что повышает производительность при множественных изменениях.

Производительность

Разница в скорости становится заметной при множественных изменениях строк.

using System;
using System.Text;

class Program
{
    static void Main()
    {
        int iterations = 10000;
        
        string text = "";
        for (int i = 0; i < iterations; i++)
        {
            text += "a";
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < iterations; i++)
        {
            sb.Append("a");
        }
    }
}

Использование StringBuilder в этом случае будет значительно быстрее, так как string создаёт новый объект на каждом шаге.

Когда использовать string и StringBuilder

  • string – если строка изменяется редко или остаётся неизменной.
  • StringBuilder – если требуется частое изменение строки, например, в цикле или при конкатенации большого количества данных.

Выбор между string и StringBuilder зависит от характера работы со строками и требований к производительности.