수색…


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 를 정상적인 문자열로 되돌리려면 간단히 StringBuilderToString() 메서드를 호출하면됩니다.


그러나 이것이 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();
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow