C# Language
StringBuilder
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 aanmyString
.
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();
}