StringBuilder 클래스는 왜 string의 간단한 패치보다 효율이 높습니까
11272 단어 StringBuilder
먼저 StringBuilder의 기본 동작을 코드로 표시합니다.
1 StringBuilder sb = new StringBuilder();
2 sb.Append("Hello!");
3 sb.Append("World,").Append("and ").Append("C#");
4
5 Console.WriteLine(sb.ToString());
6
7 Console.Read();
간단한 실현, 아마도 친구가 생각하는 세 번째 줄 코드: sb.Append("World,").Append("and ").Append("C#");이상합니다. 그렇습니다. 이것이 바로 StringBuilder 클래스의 효율적인 전형적인 실현입니다. Reflector 도구로 역컴파일하여 Append(stringvalue)를 얻는 방법은 다음과 같습니다.
1 [SecuritySafeCritical, __DynamicallyInvokable]
2 public unsafe StringBuilder Append(string value)
3 {
4 if (value != null)
5 {
6 char[] chunkChars = this.m_ChunkChars;
7 int chunkLength = this.m_ChunkLength;
8 int length = value.Length;
9 int num3 = chunkLength + length;
10 if (num3 < chunkChars.Length)
11 {
12 if (length <= 2)
13 {
14 if (length > 0)
15 {
16 chunkChars[chunkLength] = value[0];
17 }
18 if (length > 1)
19 {
20 chunkChars[chunkLength + 1] = value[1];
21 }
22 }
23 else
24 {
25 fixed (char* str = ((char*) value))
26 {
27 char* smem = str;
28 fixed (char* chRef = &(chunkChars[chunkLength]))
29 {
30 string.wstrcpy(chRef, smem, length);
31 }
32 }
33 }
34 this.m_ChunkLength = num3;
35 }
36 else
37 {
38 this.AppendHelper(value);
39 }
40 }
41 return this;
42 }
43
44
45
46
Append(string value) 방법은 String Builder 유형을 되돌려줍니다. 앞의 코드는 비위탁 관리 코드로 이루어져 있어 알아볼 수 없고 본 주제와 관계가 크지 않습니다. 관건은 마지막 문장인 Return this입니다.현재의 조작 실례를 되돌려주고 여기까지 읽으면 문득 깨달았을 수도 있습니다. 그렇습니다. 스트링 Builder 클래스가 문자열에 대한 조작은 실례를 바탕으로 수정한 것이지string 유형처럼 끊임없이 새로운 대상을 만들고 시스템 메모리의 판매를 절약하는 문제가 아닙니다.
현재 StringBuilder 클래스를 본떠서 자신의 IntBuilder 클래스를 실현하는 것은 실제적인 의미가 없고 단지 보여주기 위한 것이다.
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Intbuilder ib = new Intbuilder();
6 ib.Add(2).Add(5).Add(7);
7 Console.WriteLine(ib.Sum);
8
9 Console.Read();
10 }
11 }
12
13 class Intbuilder
14 {
15 private int _sum;
16 public int Sum
17 {
18 get { return this._sum; }
19 }
20
21 public Intbuilder Add(int value)
22 {
23 this._sum += value;
24 return this;
25 }
26 }
요약:StringBuilder는 동적 유형으로 문자열에 대한 조작은 하나의 실례에서만 수정하여 시스템 비용을 절약하는 목적을 달성하고string은 불가변성을 가진다. 모든string 유형에 대한 조작은 새로운 메모리에 새로운 문자열을 신청하여 일반적인 영향은 크지 않지만 대량의 문자열 조작, 예를 들어 순환체에서 발생하는 시스템 비용은 무시할 수 없다.
처음으로 자신의 생각으로 박문을 썼는데 실수가 있기 마련입니다. 잘못된 점이 있으면 바로잡아야 합니다. 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
String, StringBuffer, StringBuilder 어떻게 다른가?이 String 객체는 어떻게 선언을 하냐에 따라 JVM내의 String constant pool에 저장되기도하고, Heap 영역에 저장되기도 한다. 리터럴 방식으로 생성하게 되면 String constant poo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.