Стрингбилдер:как получить окончательную строку?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Кто-то сказал мне, что с помощью StringBuilder объединять строки быстрее.Я изменил свой код, но не вижу никаких свойств или методов для получения окончательной строки сборки.

Как я могу получить строку?

Это было полезно?

Решение

Вы можете использовать .ToString () , чтобы получить String из StringBuilder .

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

Когда вы говорите " быстрее объединять String с помощью String Builder " ;, это верно только в том случае, если вы неоднократно (я повторяю - неоднократно ) объединяетесь с тот же объект.

Если вы просто объединяете две строки и сразу что-то делаете с результатом в виде string , нет смысла использовать StringBuilder .

Я только что натолкнулся на приятное описание Джона Скита: http: // www. yoda.arachsys.com/csharp/stringbuilder.html

Если вы используете StringBuilder , то для получения результирующей string достаточно просто вызвать ToString () (неудивительно).

После завершения обработки с использованием StringBuilder используйте метод ToString, чтобы вернуть окончательный результат.

Из MSDN:

using System;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        // Create a StringBuilder that expects to hold 50 characters.
        // Initialize the StringBuilder with "ABC".
        StringBuilder sb = new StringBuilder("ABC", 50);

        // Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(new char[] { 'D', 'E', 'F' });

        // Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", 'J', 'k');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());

        // Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ");

        // Replace all lowercase k's with uppercase K's.
        sb.Replace('k', 'K');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
    }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK

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

О том, что память быстрее/лучше:

Я изучил эту проблему с помощью Java и предполагаю, что .NET справится с этим так же умно.

Реализация String впечатляет.

Объект String отслеживает «длину» и «общий доступ» (независимо от длины массива, содержащего строку).

Итак, что-то вроде

String a = "abc" + "def" + "ghi";

может быть реализован (компилятором/средой выполнения) как:

 - Extend the array holding "abc" by 6 additional spaces.
 - Copy def in right after abc 
 - copy ghi in after def. 
 - give a pointer to the "abc" string to a 
 - leave abc's length at 3, set a's length to 9
 - set the shared flag in both.

Поскольку большинство строк недолговечны, во многих случаях это делает код ОЧЕНЬ эффективным.Случай, когда это абсолютно НЕ эффективно, - это когда вы добавляете к строке внутри цикла или когда ваш код выглядит следующим образом:

a = "abc";
a = a + "def";
a += "ghi";

В этом случае гораздо лучше использовать конструкцию StringBuilder.

Я хочу сказать, что вам следует быть осторожными при каждой оптимизации, если только вы АБСОЛЮТНО не уверены, что знаете, что делаете, И вы абсолютно уверены, что это необходимо, И вы тестируете, чтобы убедиться, что оптимизированный код проходит вариант использования, просто запишите его. максимально читабельным способом и не пытайтесь перехитрить компилятор.

Я потратил 3 дня на возню со строками, кеширование/повторное использование построителей строк и тестирование скорости, прежде чем посмотрел исходный код строки и понял, что компилятор уже делает это лучше, чем я мог бы для моего варианта использования.Затем мне пришлось объяснить, что я ДЕЙСТВИТЕЛЬНО не понимал, что делаю, я только думал, что знаю...

Объединение не происходит быстрее. Как отметил Смаклелл, проблема заключается в том, что неизменяемая строка требует дополнительного выделения и повторного копирования существующих данных.

"a"+"b"+"c" не быстрее при использовании построителя строк, но повторяющиеся конкаты с промежуточной строкой становятся все быстрее и быстрее по мере увеличения количества конкатов, например:

х = «а»;х+="б";х+="с";...

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