Es gibt einen -Konstruktor in der Klasse StringBuilder (int32, int32). Sie sehen, dass zwei Parameter vorhanden sind: Kapazität und maxCapacity .
Ich habe versucht, den Unterschied zwischen Kapazität und maxCapacity in StringBuilder-Konstruktor zu suchen. Aber ich habe nichts verstanden, um diesen Konstruktor zu verstehen. Ich habe Dokumentation zu msdn gefunden. Dennoch verstehe ich nicht, warum es erforderlich ist und wie diese Parameter verwendet werden. Irgendeine Frage in meinem Kopf, wo sollte ich diesen Konstruktor verwenden? Und hilft es, die Leistung meiner Anwendung zu verbessern?
Vom MSDN: StringBuilder(int,int)
Initialisiert eine neue Instanz der StringBuilder-Klasse, die mit beginnt eine angegebene Kapazität und kann bis zu einem bestimmten Maximum anwachsen.
Also ist die Capcity
die Größe, mit der sie gestartet / erstellt werden muss und MaxCapacity
ist die Begrenzung der Stringbuilder
.
Beispiel 1: Probieren Sie das folgende Beispiel nacheinander aus
%Vor%Beispiel 2: Versuchen Sie das folgende Beispiel auf einmal
%Vor%BEARBEITEN:
Ja MaxCapacity
wird selten verwendet.
StringBuilder (int Capacity) : Mit Capacity
-Parameter wird das StringBuilder
-Objekt im Speicher erstellt.
Sobald der Benutzer Objekte hinzufügt und die Größe das Kapazitätslimit überschreitet, weist er mehr Speicher zu, um die überzähligen Zeichen aufzunehmen, und wächst weiter, bis kein Problem mit dem Speicher auftritt.
StringBuilder (int Capacity, int maxCapacity) : Er macht dasselbe wie oben bei einem Constructor-Parameter, aber bevor er seinen Runtime-Speicher zur Berücksichtigung von überschrittenen Zeichen erstellt / erhöht, sucht er nach MAXCAPACITY
limit überschreitet das MAXCAPACITY
-Grenze und wirft dann Exception
.
Von den folgenden Comments: Wie @Sriram sagte MaxCapacity
-Parameter hat nichts mit Speicherzuweisung zu tun.
Unterschied zwischen
Für Kapazität
Wenn die Anzahl der Zeichen, die in der aktuellen Instanz gespeichert werden sollen, diesen Kapazitätswert überschreitet, weist das Objekt StringBuilder zusätzlichen Speicher zu , um sie zu speichern.
String Builder-Klasse bietet jedoch eine effiziente Möglichkeit um String-Strings wiederholt an bereits konstruierte Objekte anzufügen.
StringBuilder ist nützlich, wenn wir eine große Zeichenfolge erstellen möchten
Kapazität steht für den zusammenhängenden Speicher, der dem StringBuilder zugewiesen wurde. Kapazität kann & gt; = Länge der Zeichenfolge sein. Wenn mehr Daten an den StringBuilder als an die Kapazität angehängt werden, erhöht StringBuilder die Kapazität automatisch. Da die Kapazität überschritten wurde (dh zusammenhängender Speicher ist voll und kein Pufferspeicher mehr verfügbar), wird ein größerer Pufferbereich zugewiesen, und Daten werden vom ursprünglichen Speicher in diesen neuen Bereich kopiert.
Es werden keine Daten in eine neue 'Instanz' kopiert, sondern in einen neuen 'Speicherort'. Die Instanz bleibt gleich, zeigt aber auf den neuen Speicherort.
Die Standardkapazität von StringBuilder ist bei der Erstellung nicht 16
Für maxCapacity
Wenn die Anzahl der in der aktuellen Instanz zu speichernden Zeichen diesen maxCapacity-Wert überschreitet, weist das Objekt StringBuilder keinen zusätzlichen Speicher zu , sondern löst stattdessen eine Ausnahme aus
Die maximale Kapazität für diese Implementierung ist Int32.MaxValue. Dieser Wert ist jedoch implementierungsspezifisch und kann in anderen oder späteren Implementierungen anders sein.
Es ist wichtig zu verstehen, dass Objekte wie ein StringBuilder internen Speicher für ihre Daten bereitstellen müssen. Das wird im Allgemeinen ein Array sein. Normalerweise ist die Größe dieses Arrays ziemlich klein. Wenn Sie dem Objekt Daten hinzufügen, muss jedes Mal, wenn die Daten über die Grenzen dieses Arrays hinaus wachsen, mehr Speicherplatz zugewiesen werden. Wenn Sie ein initiales capacity
angeben, wird das interne Array zunächst mit dieser Größe erstellt. Das bedeutet, dass die Größe des Arrays weniger geändert werden muss, wenn Daten hinzugefügt werden. Wenn Sie wissen, dass Sie dem StringBuilder mindestens N Zeichen hinzufügen, ist es sinnvoll, N als initiales capacity
anzugeben, um unnötige Größenänderungen zu vermeiden. maxCapacity
ist die größte Größe, auf die das interne Array erhöht werden kann.
Nachdem ich alle Antworten gelesen habe, verstehe ich schließlich den Unterschied zwischen Kapazität und maxCapacity. Jetzt versuche ich ein Beispiel, um die Zeit des Prozesses in verschiedenen Szenarien zu bestimmen. Also, ich werde etwas über StringBuilder Constructor teilen. Ich habe StringBuilder.Append Methode in folgenden Fällen getestet und ich habe einige Ergebnisse.
Der Anwendungscode ist einfach
%Vor%In der Deklaration von StringBuilder habe ich folgende Konstruktoren verwendet.
ie. StringBuilder str = new StringBuilder(3, 5)
Die Ergebnisse sind wie folgt
%Vor%Wenn ich ein Objekt von StringBuilder mit maxCapacity erzeuge, dauert es länger, Text anzuhängen als in zwei anderen Fällen. Aber es gibt keinen Unterschied zwischen der Deklaration eines Objekts mit Kapazität und ohne Kapazität. Ich denke, dass es einige Zeit in Anspruch nimmt, die maximale Kapazität des definierten String-Builder-Klassenobjekts zu überprüfen.
Wenn Sie also diesen Konstruktor verwenden, können Sie sowohl Ihre Leistung steigern als auch ein Limit setzen. Aus meiner Erfahrung habe ich meistens den Konstruktor benutzt, der erlaubt, die Anfangskapazität einzustellen und selten eine maxCapacity gesetzt zu haben. Aber Sie könnten diesen Konstruktor verwenden, wenn Sie Daten aus unbekannten Quellen an einen StringBuilder anhängen, z. aus einer Datei, die von Benutzern bereitgestellt wird, um früher und eleganter reagieren zu können, als die Verarbeitung einer OutOfMemoryException ermöglicht. Die Verwendung dieses Konstruktors erhöht also auch die Robustheit Ihrer Anwendung.
Tags und Links .net c# stringbuilder