문자열을 StringBuilder와 연결하는 것이 더 빠릅니다. 내 코드를 변경했지만 최종 빌드 문자열을 얻는 데 필요한 속성이나 메서드가 표시되지 않습니다.StringBuilder : 최종 문자열을 얻는 방법?
어떻게 문자열을 얻을 수 있습니까?
문자열을 StringBuilder와 연결하는 것이 더 빠릅니다. 내 코드를 변경했지만 최종 빌드 문자열을 얻는 데 필요한 속성이나 메서드가 표시되지 않습니다.StringBuilder : 최종 문자열을 얻는 방법?
어떻게 문자열을 얻을 수 있습니까?
당신은 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에서 불변이므로 문자열을 변경할 때마다 새 문자열을 만들었 기 때문입니다.
smatchll이 지적했듯이 문제는 불필요한 문자열로 인해 기존 데이터의 추가 할당과 재 복사가 필요합니다.
"는"+ "B"+ "C는"문자열 빌더와 함께 할 더 빠르지 만 중간 문자열이 빨라 CONCAT의의 # 등의 취득 취득과 concats을 반복 같은 큰 :
X = "에이"; x + = "b"; x + = "c"; ... 그것에 대해
는/더 나은 메모리 빠르다 :
내가 자바 문제를 검토, 나는 .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의 구조를 개시 훨씬 더 낫다.
내 요점은 당신이하고있는 일을 잘 알고 있고 절대적으로 필요하다고 확신하지 않는 한 최적화 할 때마다 조심해야한다는 것입니다. 최적화 된 코드가 유스 케이스를 통과 시키도록 테스트해야합니다 가능한 가장 읽기 쉬운 방법으로 코드를 작성하고 컴파일러를 생각하지 않도록하십시오.
문자열 소스 코드를 살펴보고 컴파일러가 이미 사용 사례보다 더 잘 수행하고 있다고 생각하기 전에 문자열 캐스팅/캐싱/재사용 문자열 빌더 및 테스트 속도를 낭비했습니다.그럼 내가 어떻게하는지 잘 알지 못했다는 것을 설명해야만했다. 나는 단지 내가 생각했던 것 ...
"문자열을 문자열 작성자와 연결하는 것이 더 빠릅니다"라고 말하면, 반복적으로 (반복합니다 - 반복적으로)이 동일한 개체에 연결됩니다.
문자열을 연결하여 결과를 즉시 string
으로 처리하는 경우 StringBuilder
을 사용할 필요가 없습니다. 이 ToString()
(당연히)를 호출 단지 문제, http://www.yoda.arachsys.com/csharp/stringbuilder.html
당신이 StringBuilder
를 사용하는 경우는, 그 결과 string
를 얻을 수 :
난 그냥이의 존 소총의 좋은 쓰기 최대에 비틀 거렸다.