2013-12-17 6 views
7

Was ist der Unterschied zwischen diesen beiden Methoden?TextBox.Text + = "Zeichenfolge"; vs TextBox.AppendText ("Zeichenfolge");

Ist einer effizienter als der andere?

Ich dachte, vielleicht AppendText() verwendet eine Methode ähnlich wie der StringBuilder, dh es verwendet einen eigenen Cache, anstatt jedes Mal eine neue Zeichenfolge zu erstellen und anzuhängen, ist das wahr?

Danke.

+1

Betrachten Sie es in einem Reflektor, fügt AppendText einfach über die Berechnung der Endposition dann über .SelectedText –

+0

Dokumentation hinzu: http://msdn.microsoft.com/library/system.windows.forms.textboxbase.appendtext(v= vs.110) .aspx –

Antwort

12

Wie es deutlich in Remarks section of MSDN Documentation

Die AppendText Verfahren ermöglicht es dem Benutzer erwähnte Text den Inhalt einer Textsteuerung anzuhängen, ohne Text Verkettung unter Verwendung , die zu einer besseren Leistung führen können, wenn viele Verkettungen erforderlich sind.

Ihre Frage,

was ist der Unterschied zwischen diesen beiden Methoden?

Wir alle wissen, wie TextBox.Text += something; funktioniert das heißt das Erstellen und eine neue Zeichenfolge jedes Mal anhängt, aber wie AppendText Werke Ich konnte keine Code-Schnipsel, ob es intern verwendet StringBuilder oder etwas anderes.

Ist einer effizienter als der andere?

Ich denke Antwort auf obige Frage nach der Situation abhängen, (Basierend auf Testfallbeobachtung)

wenn Multiline Eigenschaft auf false dann gesetzt Verkettungs (+ =) ergibt bessere Ergebnisse, aber auf der anderen Seite Eigenschaft wird auf festgelegt dann AppendText ergibt weit bessere Leistung.

EDIT Nach den comment from Rawling Lesen habe ich eine benutzerdefinierte Win-Form Lösung, in der ich in dem ein einfaches textbox hatte ich einen einfachen String hello mal angehängt ein einfaches for-loop

private void btnAppendText_Click(object sender, EventArgs e) 
    { 
     txtText.Text = string.Empty; 
     DateTime startTime = DateTime.Now; 
     for (int i = 0; i < 10000; i++) 
     { 
      txtText.AppendText(s); 
     } 
     DateTime endTime = DateTime.Now; 
     txtTime.Text = (endTime.Ticks - startTime.Ticks).ToString(); 
    } 

    private void btnConcante_Click(object sender, EventArgs e) 
    { 
     txtText.Text = string.Empty; 
     DateTime startTime = DateTime.Now; 
     for (int i = 0; i < 5000; i++) 
     { 
      txtText.Text += s; 
     } 
     DateTime endTime = DateTime.Now; 
     txtTime.Text = (endTime.Ticks - startTime.Ticks).ToString(); 
    } 
mit

Ausgabe waren sehr überraschend,
TEST 1: Multiline-Eigenschaft ist wahr Ich hatte die Iteration auf die Hälfte, dh 5000 für Text Verkettung zu reduzieren, wie es war sehr lange Zeit

btnAppendText_Click Ausgabe auf txtTime war 37222129 fast 3-4 Sekunden für 10000 Iteration
btnConcante_Click Ausgabe auf txtTime sprechen war 14449906487 mehr als 25 Minuten für nur 5000 Iteration

Vom ab ove Ergebnis ist es wirklich klar, dass AppendText ist viel schneller und effizienter (wenn MultilineTrue ist), dann Concatenation

TEST 2: Multiline-Eigenschaft ist falsch

btnConcante_Click Ausgabe auf txtTime war 39862280 fast 3-4 Sekunden für 10000 Iteration
btnAppendText_Click Ausgabe auf txtTime war 1043279672 fast 2-3 Minuten für 10000 Iteration

Aus dem obigen Ergebnis ist es wirklich klar, dass Verkettungs schneller und effizienter ist (wenn Multiline ist false) dann AppendText

+0

Sicher kann dies als vergleichbar mit dem Vorteil, den Sie von StringBuilder im Vergleich zu + = erhalten, wenn viele Verkettungen benötigt werden? –

+1

Die MSDN-Dokumentation ist eigentlich Quatsch. 'AppendText' ist nicht effizienter als Verkettung. Ich habe einen Leistungstest durchgeführt und '.Text + =' ist um Größenordnungen schneller als '.AppendText'. – Rawling

+0

@dbw - nicht wahr - wir haben Reflektor :) Microsoft-Code ist nicht geschützt vor ( –

0

Der AppendText hat nichts mit StringBuilder zu tun. Die Text-Methode scheint tatsächlich einfacher (möglicherweise leistungsfähiger). Siehe Quellcode dieser beiden Methoden zur Referenz:

public void AppendText(string text) 
{ 
    if (text.Length > 0) 
    { 
     int start; 
     int length; 
     this.GetSelectionStartAndLength(out start, out length); 
     try 
     { 
      int endPosition = this.GetEndPosition(); 
      this.SelectInternal(endPosition, endPosition, endPosition); 
      this.SelectedText = text; 
     } 
     finally 
     { 
      if (base.Width == 0 || base.Height == 0) 
      { 
       this.Select(start, length); 
      } 
     } 
    } 
} 


public override string Text { 
    get { 
    return base.Text; 
    } 
    set { 
    if (value != base.Text) { 
     base.Text = value; 
     if (base.IsHandleCreated) { 
     base.SendMessage(185, 0, 0); 
     } 
    } 
    } 
} 
+0

Ich könnte falsch liegen, aber es scheint nicht einmal eine Auswahl richtig zu bestehen: -/Eg Ich habe einen 'KeyDown'-Handler platziert, der' AppendText' aufruft, wenn du Control drückst, und er löscht immer noch die Auswahl, die du getroffen hast. – Rawling

+0

@Rawling - Danke für das Update, ich habe tatsächlich erraten, was es aus dem Quellcode (Kopf-Compiler), anstatt tatsächlich zu sehen, wie es im wirklichen Leben funktioniert :) Ich habe meine Antwort entsprechend bearbeitet. –

0

Als Ergänzung zu dbw (und für den Fall, kann jemand finden, wo ich einen Fehler) gemacht haben, hier ist meine Performance-Test:

private void Form1_Click(object sender, EventArgs e) 
{ 
    Stopwatch sw = new Stopwatch(); 

    sw.Reset(); 
    textBox1.Text = ""; 
    sw.Start(); 
    for (int i = 0; i < 10000; i++) 
    { 
     textBox1.Text += s; 
    } 
    sw.Stop(); 
    var e1 = sw.Elapsed; 

    sw.Reset(); 
    textBox1.Text = ""; 
    sw.Start(); 
    for (int i = 0; i < 10000; i++) 
    { 
     textBox1.AppendText(s); 
    } 
    sw.Stop(); 
    var e2 = sw.Elapsed; 
} 

I e1 mit ca. 3 Sekunden und e2 Witz sehen h ca. 2 Minuten.

+0

Ich habe die Schleife im ersten Fall auf '1000' reduziert, da es länger gedauert hat, die Ausgabe beim Debugging habe ich' TotalSeconds = 16.334709399999998' und mit 'AppendText'' 10000' Iterationen 'TotalSeconds = 3.7410611' – dbw

+0

Bitte versuchen Sie den gleichen Code von die Eigenschaft "Multiline" zu "true" machen – dbw

+1

@dbw Nice one. Ich bekomme entgegengesetzte Ergebnisse mit 'Multiline' on! Gut von Microsoft, um das irgendwo zu dokumentieren ... – Rawling

Verwandte Themen