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.
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:
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.
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.
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.
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.
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());
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.
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);
// 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;
}
C # auf den Punkt gebracht Um den Inhalt einer StringBuilder
zu löschen, gibt es zwei Möglichkeiten:
Length
auf Null: Durch das Festlegen von
Length
für einen StringBuilder aufzero
wird 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.
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.
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