Zoeken…


Wat een StringBuilder is en wanneer een te gebruiken

Een StringBuilder vertegenwoordigt een reeks tekens, die in tegenstelling tot een normale tekenreeks kunnen worden gewijzigd. Vaak is het nodig om strings te wijzigen die we al hebben gemaakt, maar het standaard string-object is niet mutable. Dit betekent dat elke keer dat een string wordt gewijzigd, een nieuw stringobject moet worden gemaakt, gekopieerd naar en vervolgens opnieuw toegewezen.

string myString = "Apples";
mystring += " are my favorite fruit";

In het bovenstaande voorbeeld heeft myString eerste instantie alleen de waarde "Apples" . Wanneer we echter 'zijn mijn favoriete fruit' samenvoegen, houdt de stringklasse intern in:

  • Een nieuwe reeks tekens maken die gelijk is aan de lengte van myString en de nieuwe tekenreeks die we toevoegen.
  • Alle tekens van myString naar het begin van onze nieuwe array kopiëren en de nieuwe string naar het einde van de array kopiëren.
  • Maak een nieuw myString in het geheugen en wijs het opnieuw toe aan myString .

Voor een enkele aaneenschakeling is dit relatief triviaal. Maar wat als dat nodig is om veel toevoegbewerkingen uit te voeren, bijvoorbeeld in een lus?

String myString = "";
for (int i = 0; i < 10000; i++)
    myString += " "; // puts 10,000 spaces into our string

Vanwege het herhaald kopiëren en het maken van objecten, zal dit de prestaties van ons programma aanzienlijk verminderen. We kunnen dit voorkomen door in plaats daarvan een StringBuilder .

StringBuilder myStringBuilder = new StringBuilder();    
for (int i = 0; i < 10000; i++)
    myStringBuilder.Append(' ');

Wanneer nu dezelfde lus wordt uitgevoerd, zijn de prestaties en snelheid van de uitvoeringstijd van het programma aanzienlijk sneller dan bij gebruik van een normale tekenreeks. Om van StringBuilder weer een normale string te maken, kunnen we eenvoudig de ToString() -methode van StringBuilder aanroepen.


Dit is echter niet de enige optimalisatie die StringBuilder heeft. Om functies verder te optimaliseren, kunnen we profiteren van andere eigenschappen die de prestaties helpen verbeteren.

StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000

Als we van tevoren weten hoe lang onze StringBuilder moet zijn, kunnen we de grootte van tevoren opgeven, waardoor wordt voorkomen dat het formaat van de interne array moet worden aangepast.

sb.Append('k', 2000);

Hoewel het gebruik van StringBuilder voor het toevoegen veel sneller is dan een string, kan het nog sneller worden uitgevoerd als je maar één keer een enkel karakter hoeft toe te voegen.

Zodra u klaar bent met het bouwen van de string, kunt u gebruik ToString() methode op de StringBuilder om het te converteren naar een basis string . Dit is vaak nodig omdat de StringBuilder klasse niet van string .

Hier ziet u bijvoorbeeld hoe u een StringBuilder kunt gebruiken om een string te maken:

string RepeatCharacterTimes(char character, int times)
{
    StringBuilder builder = new StringBuilder("");
    for (int counter = 0; counter < times; counter++)
    {
        //Append one instance of the character to the StringBuilder.
        builder.Append(character);
    }
    //Convert the result to string and return it.
    return builder.ToString();
}

Concluderend moet StringBuilder worden gebruikt in plaats van een string wanneer veel wijzigingen in een string moeten worden aangebracht met het oog op de prestaties.

Gebruik StringBuilder om een string te maken van een groot aantal records

public string GetCustomerNamesCsv()
{
    List<CustomerData> customerDataRecords = GetCustomerData(); // Returns a large number of records, say, 10000+

    StringBuilder customerNamesCsv = new StringBuilder();
    foreach (CustomerData record in customerDataRecords)
    {
       customerNamesCsv
           .Append(record.LastName)
           .Append(',')
           .Append(record.FirstName)
           .Append(Environment.NewLine);
    }

    return customerNamesCsv.ToString();
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow