StringBuilder : 최종 문자열을 얻는 방법?
누군가 StringBuilder와 문자열을 연결하는 것이 더 빠르다고 말했습니다. 코드를 변경했지만 최종 빌드 문자열을 가져 오는 속성이나 메서드가 표시되지 않습니다.
문자열을 어떻게 얻을 수 있습니까?
당신은 사용할 수 있습니다 .ToString()
를 얻을 String
로부터 StringBuilder
.
당신은 "이 문자열 빌더 CONCATENATE 문자열로 빠르다"말할 때 당신이 경우에, 이것은 단지 사실이다 반복적으로 - (I 반복 반복적으로 동일한 개체에 합치).
두 개의 문자열을 연결하고 결과로 즉시 a로 무언가를 수행하는 경우을 사용할 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 구현은 매우 인상적입니다.
String 객체는 "length"및 "shared"를 추적합니다 (문자열을 보유하는 배열의 길이와 무관).
그래서 뭔가
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.
Since most strings are short-lived, this makes for some VERY efficient code in many cases. The case where it's absolutely NOT efficient is when you are adding to a string within a loop, or when your code is like this:
a = "abc";
a = a + "def";
a += "ghi";
In this case, you are much better off using a StringBuilder construct.
My point is that you should be careful whenever you optimize, unless you are ABSOLUTELY sure that you know what you are doing, AND you are absolutely sure it's necessary, AND you test to ensure the optimized code makes a use case pass, just code it in the most readable way possible and don't try to out-think the compiler.
I wasted 3 days messing with strings, caching/reusing string-builders and testing speed before I looked at the string source code and figured out that the compiler was already doing it better than I possibly could for my use case. Then I had to explain how I didn't REALLY know what I was doing, I only thought I did...
It's not faster to concat - As smaclell pointed out, the issue is the immutable string forcing an extra allocation and recopying of existing data.
"a"+"b"+"c" is no faster to do with string builder, but repeated concats with an intermediate string gets faster and faster as the # of concat's gets larger like:
x = "a"; x+="b"; x+="c"; ...
참고URL : https://stackoverflow.com/questions/227743/stringbuilder-how-to-get-the-final-string
'Development Tip' 카테고리의 다른 글
Windows 용 Docker 실행, 포트 노출시 오류 (0) | 2020.12.14 |
---|---|
C ++로 텍스트 파일을 읽는 가장 우아한 방법은 무엇입니까? (0) | 2020.12.14 |
PHP에서 시간과 분 얻기 (0) | 2020.12.14 |
C ++, Windows 프로세스가 실행 중인지 확인하는 방법은 무엇입니까? (0) | 2020.12.14 |
프로그래밍 방식으로 무음 모드의 Android 전화 여부를 어떻게 감지합니까? (0) | 2020.12.14 |