2008-10-22 5 views
47

문자열을 StringBuilder와 연결하는 것이 더 빠릅니다. 내 코드를 변경했지만 최종 빌드 문자열을 얻는 데 필요한 속성이나 메서드가 표시되지 않습니다.StringBuilder : 최종 문자열을 얻는 방법?

어떻게 문자열을 얻을 수 있습니까?

답변

89

당신은 StringBuilder에서 String를 얻을 수 .ToString()를 사용할 수 있습니다.

8

StringBuilder를 사용하여 처리를 완료하면 ToString 메서드를 사용하여 최종 결과를 반환합니다.

MSDN에서

:

using System; 
using System.Text; 

public sealed class App 
{ 
    static void Main() 
    { 
     // Create a StringBuilder that expects to hold 50 characters. 
     // Initialize the StringBuilder with "ABC". 
     StringBuilder sb = new StringBuilder("ABC", 50); 

     // Append three characters (D, E, and F) to the end of the StringBuilder. 
     sb.Append(new char[] { 'D', 'E', 'F' }); 

     // Append a format string to the end of the StringBuilder. 
     sb.AppendFormat("GHI{0}{1}", 'J', 'k'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 

     // Insert a string at the beginning of the StringBuilder. 
     sb.Insert(0, "Alphabet: "); 

     // Replace all lowercase k's with uppercase K's. 
     sb.Replace('k', 'K'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 
    } 
} 

// This code produces the following output. 
// 
// 11 chars: ABCDEFGHIJk 
// 21 chars: Alphabet: ABCDEFGHIJK 
3

필자는 단지 그 속도가 반드시 빠를 필요는 없다는 것을 알리고 싶습니다. 확실히 더 나은 메모리 사용량을 갖습니다. 이것은 문자열이 .NET에서 불변이므로 문자열을 변경할 때마다 새 문자열을 만들었 기 때문입니다.

1

smatchll이 지적했듯이 문제는 불필요한 문자열로 인해 기존 데이터의 추가 할당과 재 복사가 필요합니다.

"는"+ "B"+ "C는"문자열 빌더와 함께 할 더 빠르지 만 중간 문자열이 빨라 CONCAT의의 # 등의 취득 취득과 concats을 반복 같은 큰 :

X = "에이"; x + = "b"; x + = "c"; ... 그것에 대해

1

는/더 나은 메모리 빠르다 :

내가 자바 문제를 검토, 나는 .NET 그것에 대해 스마트 될 것입니다 가정합니다.

String 구현은 꽤 인상적입니다.

String a = "abc" + "def" + "ghi"; 

가 컴파일러에 의해 (구현 될 수

String 객체 트랙 (문자열을 보유하고 배열의 길이의 독립) "길이"및 "공유"

그래서 뭔가처럼/런타임)은 다음과 같습니다.

 
- Extend the array holding "abc" by 6 additional spaces. 
- Copy def in right after abc 
- copy ghi in after def. 
- give a pointer to the "abc" string to a 
- leave abc's length at 3, set a's length to 9 
- set the shared flag in both. 

대부분의 문자열은 수명이 짧기 때문에 많은 경우에 매우 효율적인 코드를 생성합니다. 당신은 루프 내에서 문자열에 추가 할 때 절대적으로 효율적이지의 이 사건은, 또는 코드가 같은 경우 :이 경우

a = "abc"; 
a = a + "def"; 
a += "ghi"; 

, 당신은 StringBuilder의 구조를 개시 훨씬 더 낫다.

내 요점은 당신이하고있는 일을 잘 알고 있고 절대적으로 필요하다고 확신하지 않는 한 최적화 할 때마다 조심해야한다는 것입니다. 최적화 된 코드가 유스 케이스를 통과 시키도록 테스트해야합니다 가능한 가장 읽기 쉬운 방법으로 코드를 작성하고 컴파일러를 생각하지 않도록하십시오.

문자열 소스 코드를 살펴보고 컴파일러가 이미 사용 사례보다 더 잘 수행하고 있다고 생각하기 전에 문자열 캐스팅/캐싱/재사용 문자열 빌더 및 테스트 속도를 낭비했습니다.그럼 내가 어떻게하는지 잘 알지 못했다는 것을 설명해야만했다. 나는 단지 내가 생각했던 것 ...

11

"문자열을 문자열 작성자와 연결하는 것이 더 빠릅니다"라고 말하면, 반복적으로 (반복합니다 - 반복적으로)이 동일한 개체에 연결됩니다.

문자열을 연결하여 결과를 즉시 string으로 처리하는 경우 StringBuilder을 사용할 필요가 없습니다. 이 ToString() (당연히)를 호출 단지 문제, http://www.yoda.arachsys.com/csharp/stringbuilder.html

당신이 StringBuilder를 사용하는 경우는, 그 결과 string를 얻을 수 :

난 그냥이의 존 소총의 좋은 쓰기 최대에 비틀 거렸다.

관련 문제