Класс string неэффективный для осуществления повторяющихся изменений строки, т.к. после инициализации объекта string он больше не может измениться, а методы и операторы которые изменяют содержимое строки, в действительности создают новые строки, копируя в них содержимое старых строк в случае необходимости.
string Greeting = "Hello "; Greeting += "world!";
Создается объект типа string который инициализируется текстом. При этом среда .NET выделяет ровно столько памяти, сколько необходимо для хранения строки (39) символов, а переменная Greeting будет ссылаться на этот экземпляр строки.
Далее создается новый экземпляр строки, под который выделяется ровно столько памяти, сколько требуется для объединенного текста (в суме 12 символов). Первоначальная строка копируется в новую строку, с добавлением нового текста, после чего обновляется адрес, хранящийся в переменной Greeting (старый строковый объект выходит из области видимости и будет удален сборщиком).
Для решения этой проблемы существует класс System.Text.StringBuilder. Действия ограничены заменой, добавлением и удалением текста. Однако он работает более эффективно. При создании StringBuilder выделяется больше памяти (явно указывается). Если не сделать этого, то в зависимости от размера переданной строки будет отведено определенное количество памяти по умолчанию. Length – свойство, показывает длину строки; Capacity – сколько памяти было выделено в целом.
Все изменения строки происходят в этом блоке памяти, т.е. добавление строк и изменение символов происходят более эффективно. Однако удаление и вставка подстрок по-прежнему являются не эффективными, поскольку при этом часть строки должна быть перемещена. Только в том случае, если при выполнении той или иной операции превышается объем отведенной под строку памяти, выделяется новый участок памяти и в него перемещается строка (приблизительно в 2 раза больше).
StringBuilder str = new StringBuilder("Hello world!", 20); str.Append("Sauron918");
Обычно для манипуляций со строками используется StringBuilder, а для хранения и вывода на экран окончательного результата – string.
Форматирование строк
Интерфейс IFormatable определяет только один метод, который также называется ToString(), однако этот метод в противоположность версии System.Object, не принимающей параметров, ожидает два параметра.
string ToString(string format, IFormatProvider formatProvider)
Первый параметр – стока указывающая запрашиваемый формат (часть спецификатора которая располагается в { } в строке). Второй параметр – ссылка на объект, который реализует интерфейс IFormatProvider (предоставляет дополнительную информацию, которая может потребоваться ToString(), если null то будет использовано географическое положение, указанное в системных настройках). Строка форматирования состоит из: текста и индекса переменной в фигурных скобках
{0:10:E} – число позиций, которое может занимать представление элемента, отрицательное показывает, что элемент должен быть выровнен по левому краю, положительны – по правому; индекс переменной в списке параметров; спецификатор формата, соответственно.