문제

누군가가 StringBuilder와 현을 연결하는 것이 더 빠르다고 말했습니다. 코드를 변경했지만 최종 빌드 문자열을 얻을 수있는 속성이나 메소드가 표시되지 않습니다.

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

도움이 되었습니까?

해결책

당신이 사용할 수있는 .ToString() 얻기 위해 String ~로부터 StringBuilder.

다른 팁

"문자열 빌더로 문자열을 연결하는 것이 더 빠릅니다"라고 말하면 이것은 당신이있는 경우에만 사실입니다. 자꾸 (다시 한번 말한다 - 자꾸) 동일한 개체와 연결됩니다.

두 줄을 연결하고 결과를 즉시 string, 사용 할 필요가 없습니다 StringBuilder.

방금 Jon Skeet의 멋진 글을 우연히 발견했습니다. http://www.yoda.arachsys.com/csharp/stringbuilder.html

사용중인 경우 StringBuilder, 그런 다음 결과를 얻습니다 string, 그것은 단지 전화의 문제 일뿐입니다 ToString() (놀랍지 않게).

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

나는 반드시 더 빠르지 않을 수도 있고, 더 나은 메모리 발자국을 가질 것입니다. 문자열은 .NET에서 불변이없고 문자열을 변경할 때마다 새 문자열을 만들었 기 때문입니다.

더 빠르거나 더 나은 메모리에 대해 :

나는 Java와 함께이 문제를 살펴 보았습니다. .net은 그것에 대해 똑똑 할 것이라고 생각합니다.

문자열 구현은 매우 인상적입니다.

문자열 객체는 "길이"및 "공유"를 추적합니다 (문자열을 보유하는 배열의 길이와 무관)

그래서

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

컴파일러/런타임으로 구현할 수 있습니다.

 - 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 Construct를 사용하는 것이 훨씬 좋습니다.

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

문자열 소스 코드를보고 컴파일러가 내 사용 케이스에 대해 가능한 것보다 이미 더 잘 수행하고 있음을 알아 내기 전에 문자열, 캐싱/재사용 스트링 빌더 및 테스트 속도를 3 일 낭비했습니다. 그런 다음 내가 무엇을하고 있는지 실제로 몰랐던 방법을 설명해야했는데, 나는 내가 그렇게 생각했다고 생각했습니다 ...

Smaclell이 지적했듯이, 문제는 기존 데이터의 추가 할당과 재생을 강요하는 불변의 현악기입니다.

"A"+"B"+"C"는 String Builder와 더 빠르지 않지만 Concat 's의 #이 더 커짐에 따라 중간 문자열을 가진 반복 된 Concats가 더 빠르고 점점 더 빠릅니다.

x = "a"; x+= "b"; x+= "C"; ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top