it-swarm.com.de

der beste Weg, um den Inhalt von .NET StringBuilder zu löschen

Ich möchte Sie fragen, was Sie für die beste Methode halten (dauert weniger/verbraucht weniger Ressourcen), um den Inhalt zu löschen, um einen StringBuilder wiederzuverwenden. Stellen Sie sich folgendes Szenario vor:

StringBuilder sb = new StringBuilder();
foreach(var whatever in whateverlist)
{
  sb.Append("{0}", whatever);
}

//Perform some stuff with sb

//Clear stringbuilder here

//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
  sb.Append("{0}", whatever2);
}

Beim Löschen von StringBuilder fallen mir zwei Möglichkeiten ein:

sb = new StringBuilder();

oder

sb.Length = 0;

Was ist der beste Weg, um es zu löschen und warum? 

Vielen Dank.

BEARBEITEN: Ich verwende die aktuelle .NET 3.5-Version.

67
David Espart

Wenn Sie dies in .NET 2.0 oder 3.5 durchführen, schreiben Sie eine Erweiterungsmethode wie folgt:

/// <summary>
///     Clears the contents of the string builder.
/// </summary>
/// <param name="value">
///     The <see cref="StringBuilder"/> to clear.
/// </param>
public static void Clear(this StringBuilder value)
{
    value.Length = 0;
    value.Capacity = 0;
}

Dann können Sie es so löschen:

someStringBuilder.Clear();

Wenn 4.0 herauskommt, können Sie Ihre Erweiterungsmethode zugunsten der Version 4.0 aufgeben.

UPDATE: Es ist wahrscheinlich keine gute Idee, Capacity auf Null zu setzen. Dies garantiert eine Neuzuordnung, wenn Sie an den Builder anhängen, wenn Sie dieselbe Instanz wiederverwenden. Der Speicher in der Instanz des Builders wird jedoch erst freigegeben, wenn Sie die Kapazität auf einen sehr kleinen Wert (z. B. 1) setzen. Der Standardwert der Capacity-Eigenschaft ist 16. Möglicherweise möchten Sie die Verwendung von 16 in Betracht ziehen oder (obwohl es weniger effizient ist), die Kapazität zweimal einstellen: 

  • Setzen Sie den Wert auf 1 oder Null, um den Speicher zu löschen
  • Setzen Sie den ursprünglichen Kapazitätswert (der von 16 abweichen kann), um ihn wiederherzustellen.
64
Mike Hofer

In .NET 4.0 können Sie sb.Clear() aufrufen, aber in älteren Versionen sollten Sie sb.Length = 0 einstellen.

Die Clear()-Methode wurde in .NET 4.0 hinzugefügt.

28
GraemeF

Erstellen Sie den neuen StringBuilder. Das alte verwaltet Ressourcen, die mit ihm verbunden sind (zum Beispiel Puffer mit maximaler Länge), die am besten nur Müll gesammelt wird.

15
Paul Sonier

Ich denke, Sie machen eine vorzeitige Optimierung.

Ich würde wetten, dass sb.Length=0; am schnellsten sein würde, um ein anderes Objekt zu erstellen und ein anderes Objekt beiseite zu legen, damit GC es schließlich sammeln kann. 

Ich denke, das Erstellen eines neuen StringBuilder wäre die beste Lösung für Speicheranliegen. und Einstellung sb.Length wäre die beste Einstellung für Geschwindigkeitsbelange. 

10
Earlz

Aus Community-Inhalten auf MSDN :

So löschen Sie effektiv Ihre Stringbuilder ohne ihn zu zerstören benutzen:

 someStringBuilder.length = 0;
 someStringBuilder.capacity = 0;

Dies zerstört sowohl den Inhalt als auch verkleinert es auf null. Wie oben beschrieben löschen Sie die Größe kann kleiner wirken Anwendungen.

10

In .NET Framework 4 wurden neue Methoden in der Klasse StringBuilder eingeführt. Der Methodenname lautet "Clear". Diese Methode hilft Ihnen, Werte oder Daten von StringBuilder-Objekten zu löschen oder zu entfernen.

Hier ist ein Beispiel dafür.

    System.Text.StringBuilder objSB = new System.Text.StringBuilder();
    //Append values
    objSB.Append("This is .Net Blog.");
    objSB.Append("You can get latest C# Tips over here.");

    //Display on screen
    Response.Write(objSB.ToString());
    Response.Write("<br/><br/>");

    //Clear object using Clear method
    objSB.Clear();

    //Append another values
    objSB.Append("This blog is very useful for .Net Beginners");

    Response.Write("After Clear<br/><br/>");
    //Display on screen
    Response.Write(objSB.ToString());
5
Jayesh Sorathia

Wenn Sie die Speicherauslastung reduzieren möchten, würde ich den CLR-Profiler verwenden, um zu überprüfen, wie viel Speicher Ihre StringBuilder-Objekte während ihres gesamten Lebenszyklus verwenden, und verwenden Sie dabei die oben beschriebenen Methoden. Dann können Sie sich davon überzeugen, dass die von Ihnen gewählte Option für Ihre Bedürfnisse geeignet ist und die Ressourcen freigibt, für die Sie sie benötigen.

2
Kim R

Ich würde sagen, der beste Weg, es zu löschen, ist sb = new StringBuilder();. Ich denke, es wäre noch besser, wenn Sie ein neues String-Builder-Objekt erstellen würden.

EDIT

Ich hoffe, dass dies selbstverständlich die beste Lösung ist.

public StringBuilder MakeString(IEnumerable<CoolType> list)
{
    StringBuilder sb = new StringBuilder();

    foreach(var whatever in list)
    {
        sb.Append("{0}", whatever);
    }
}

var sb = MakeString(whateverList);
// Do stuff
// Clear stuff
sb = MakeString(whateverList2);
1
Matt Grande
// P.S. to be ultra efficient 
// make a good guess at the initial allocation too !!!!
int PerWhatever_SizeEstimate = 4; // a guess of average length... you known your data
StringBuilder sb = new StringBuilder( whateverlist.Length * PerWhatever_SizeEstimate);

// reallocation needed? 
// if you want to be efficient speed and memory wise... 
sb.Length = 0;  // rest internal index but don't release/resize memory
// if a ...BIG... difference in size
if( whatever2.Length < whatever.Length * 2/3  
 || whatever2.Length > whatever.Length * 1.5)
{
    //scale capacity appropriately
    sb.Capaciy = sb.Capacity * whatever2.Length / whatever.Length;
}
0
PJJ

C # auf den Punkt gebracht Um den Inhalt einer StringBuilderzu löschen, gibt es zwei Möglichkeiten:

  1. Setzen Sie den Lengthauf Null:

    Durch das Festlegen von Lengthfür einen StringBuilder auf zerowird die interne Kapazität nicht verringert. Wenn der StringBuilder zuvor eine Million Zeichen enthielt, belegt er nach dem Nullsetzen seiner Länge weiterhin etwa 2 MB Speicher.

  2. Instanziiere einen neuen:

    Wenn Sie release the memory möchten, müssen Sie einen neuen StringBuilder erstellen und dem alten erlauben, den Gültigkeitsbereich zu verlassen (und überflüssig zu werden). Mit diesem Ansatz können Sie das vorherige Elementproblem lösen.

0
Sina Lotfi

Rufen Sie einfach die Clear () -Methode auf, und setzen Sie length = 0, Wir können Capacity = 0 auch setzen, wenn Sie Speicherplatz sparen möchten

public StringBuilder Clear() {
        this.Length = 0;
        return this;
 }

Ref: In ReferenzenQuelle.Microsoft.com

0
MaxJ