C# Language
StringBuilder
수색…
StringBuilder는 무엇이며 언제 사용합니까?
StringBuilder
는 일반 문자열과 달리 일련의 문자를 나타냅니다. 종종 우리가 이미 만든 문자열을 수정할 필요가 있지만 표준 문자열 개체는 변경할 수 없습니다. 즉, 문자열을 수정할 때마다 새 문자열 객체를 만들어 복사하고 다시 할당해야합니다.
string myString = "Apples";
mystring += " are my favorite fruit";
위의 예에서 myString
처음에는 "Apples"
값만 갖습니다. 그러나 우리가``내가 가장 좋아하는 과일 ''을 연결하면 내부적으로 문자열 클래스가해야 할 일은 다음과 같습니다.
-
myString
의 길이와 추가하는 새로운 캐릭터 라인과 같은 문자의 새로운 배열을 작성합니다. -
myString
모든 문자를 새 배열의 처음으로 복사하고 새 문자열을 배열의 끝에 복사합니다. - 메모리에 새 문자열 객체를 만들고이를
myString
다시 지정합니다.
단일 연결의 경우 이는 비교적 사소한 것입니다. 그러나 루프에 많은 추가 작업을 수행해야하는 경우 어떻게해야합니까?
String myString = "";
for (int i = 0; i < 10000; i++)
myString += " "; // puts 10,000 spaces into our string
반복되는 복사와 객체 생성으로 인해 프로그램 성능이 현저히 떨어집니다. 대신 StringBuilder
를 사용하여이를 피할 수 있습니다.
StringBuilder myStringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++)
myStringBuilder.Append(' ');
이제 동일한 루프가 실행될 때 프로그램의 실행 시간의 성능과 속도가 일반 문자열을 사용하는 것보다 훨씬 빠릅니다. StringBuilder
를 정상적인 문자열로 되돌리려면 간단히 StringBuilder
의 ToString()
메서드를 호출하면됩니다.
그러나 이것이 StringBuilder
가 가진 유일한 최적화는 아닙니다. 기능을 더욱 최적화하기 위해 성능 향상에 도움이되는 다른 속성을 활용할 수 있습니다.
StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000
StringBuilder
길이를 미리 알고 있다면 미리 크기를 지정할 수 있으므로 내부적으로 포함 된 문자 배열의 크기를 조정할 필요가 없습니다.
sb.Append('k', 2000);
StringBuilder
위해 StringBuilder
를 사용하는 것은 문자열보다 훨씬 빠르지 만 한 문자를 여러 번 추가해야하는 경우 더 빨리 실행할 수 있습니다.
문자열 작성을 완료하면 StringBuilder
에서 ToString()
메서드를 사용하여 기본 string
로 변환 할 수 있습니다. StringBuilder
클래스가 string
에서 상속되지 않기 때문에 이것은 종종 필요 string
.
예를 들어, 다음은 StringBuilder
를 사용하여 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();
}
결론적으로 StringBuilder
를 문자열 대신 사용하여 문자열을 여러 번 수정해야 성능을 염두에 두어야합니다.
StringBuilder를 사용하여 많은 수의 레코드에서 문자열 만들기
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();
}