Frage

Jemand hat mir gesagt, dass es schneller ist Saiten mit String verketten. Ich habe meinen Code geändert, aber ich sehe keine Eigenschaften oder Methoden, um das endgültige Build-String zu erhalten.

Wie kann ich die Zeichenfolge?

War es hilfreich?

Lösung

Sie können .ToString() verwenden, um die String vom StringBuilder zu erhalten.

Andere Tipps

Wenn Sie sagen, „es schneller ist String zu verketten mit einem String-Builder“, das ist nur wahr, wenn Sie sind wiederholt (ich wiederhole - wiederholt ) verketten auf den gleichen Objekt.

Wenn Sie nur zwei Strings verketten und etwas zu tun, mit dem Ergebnis, sofort als string, gibt es keinen Grund zu StringBuilder verwendet wird.

Ich stolperte auf Jon Skeet schön aufzuschreiben dafür: http: // www. yoda.arachsys.com/csharp/stringbuilder.html

Wenn Sie StringBuilder verwenden, dann den resultierenden string zu bekommen, es ist nur eine Frage ToString() des Aufrufs (wenig überraschend).

Wenn Sie die Bearbeitung abgeschlossen haben, die Stringbuilder, verwenden Sie die ToString-Methode das Endergebnis zurückzukehren.

Von 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

Ich möchte nur, dass werfen, ist schneller nicht unbedingt, es wird auf jeden Fall einen besseren Speicherbedarf hat. Dies liegt daran, String ist unveränderlich in .NET und jedes Mal, wenn Sie eine Zeichenfolge ändern Sie einen neuen angelegt haben.

Über es ist schneller / besser Speicher:

ich in diese Frage sah mit Java, gehe ich davon aus .NET würde darüber, wie klug sein.

Die Implementierung für String ist ziemlich beeindruckend.

Die Zeichenfolge Objektspuren „length“ und „shared“ (unabhängig von der Länge des Arrays, die die Zeichenfolge halten)

So etwas wie

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

kann (durch den Compiler / runtime) implementiert werden, wie:

 - 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.

Da die meisten Saiten sind kurzlebig, macht dies für einige sehr effizienten Code in vielen Fällen. Der Fall, wo es ist absolut nicht effizient ist, wenn Sie in einer Schleife in eine Zeichenfolge hinzufügen, oder wenn Ihr Code wie folgt aus:

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

In diesem Fall sind Sie viel besser dran mit einem String Konstrukt.

Mein Punkt ist, dass Sie sollten vorsichtig sein, wenn Sie zu optimieren, wenn Sie absolut sicher sind, dass Sie wissen, was Sie tun, und Sie sind absolut sicher, dass es notwendig ist, und Sie testen die optimierten Code, um sicherzustellen, einen Pass Anwendungsfall macht, kodieren sie nur in den meisten lesbaren Art und Weise möglich, und nicht versuchen, aus-denken Compiler.

verschwendete ich 3 Tage Messing mit Strings, Caching / Wiederverwendung von String-Builder und Prüfgeschwindigkeit, bevor ich an dem String-Quellcode geschaut und herausgefunden, dass der Compiler bereits tat es besser, als ich nur kann für meinen Anwendungsfall. Dann musste ich erklären, wie ich nicht wirklich wusste, was ich tat, dachte ich nur ich habe ...

Es ist nicht schneller concat -. Wie smaclell darauf hingewiesen, das Problem der unveränderliche String ist eine zusätzliche Zuweisung und Umkopieren der vorhandenen Daten zu zwingen

„a“ + „b“ + „c“ ist nicht schneller mit String-Builder zu tun, aber wiederholter concats mit einem Zwischen String wird schneller und schneller als die Anzahl der concat des größer wird, wie:

x = "a"; x + = "b"; x + = "c"; ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top