Sök…


Vad en StringBuilder är och när man ska använda en

En StringBuilder representerar en serie tecken, som till skillnad från en vanlig sträng, är muterbara. Ofta finns det behov av att ändra strängar som vi redan har gjort, men standardsträngobjektet är inte muterbart. Detta innebär att varje gång en sträng modifieras måste ett nytt strängobjekt skapas, kopieras till och sedan tilldelas om.

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

I exemplet ovan har myString initialt bara värdet "Apples" . Men när vi slår samman "" är min favoritfrukt ", innebär det vad strängklassen internt behöver göra:

  • Skapa en ny grupp med tecken lika mycket som längden på myString och den nya strängen vi lägger till.
  • Kopiering av alla tecken i myString till början av vår nya matris och kopiering av den nya strängen i slutet av matrisen.
  • Skapa ett nytt strängobjekt i minnet och tilldela det till myString .

För en enda sammankoppling är detta relativt trivialt. Men vad om det behövs för att utföra många tilläggsoperationer, säg, i en slinga?

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

På grund av upprepad kopiering och objektskapning kommer detta att försämra prestandan för vårt program avsevärt. Vi kan undvika detta genom att istället använda en StringBuilder .

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

När samma slinga nu körs, kommer prestandan och hastigheten för körningstiden för programmet att vara betydligt snabbare än med en vanlig sträng. För att göra StringBuilder tillbaka till en normal sträng kan vi helt enkelt kalla ToString() -metoden för StringBuilder .


Detta är dock inte den enda optimering som StringBuilder har. För att ytterligare optimera funktioner kan vi dra nytta av andra egenskaper som förbättrar prestanda.

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

Om vi i förväg vet hur länge vår StringBuilder behöver vara, kan vi ange dess storlek i förväg, vilket kommer att förhindra den från att behöva ändra storlek på karaktärsuppsättningen som den har internt.

sb.Append('k', 2000);

Även om att använda StringBuilder för att lägga till är mycket snabbare än en sträng, kan det köras ännu snabbare om du bara behöver lägga till ett enda tecken många gånger.

När du är klar bygga din sträng, kan du använda ToString() metod på StringBuilder att konvertera den till en grundläggande string . Detta är ofta nödvändigt eftersom StringBuilder klassen inte ärver från string .

Så här till exempel kan du använda en StringBuilder att skapa en string :

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();
}

Sammanfattningsvis bör StringBuilder användas i stället för strängen när många ändringar av en sträng måste göras med tanke på prestanda.

Använd StringBuilder för att skapa sträng från ett stort antal poster

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow