C# Language
String
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();
}