StringBuilder 클래스는 왜 string의 간단한 패치보다 효율이 높습니까

11272 단어 StringBuilder
string 유형은 불변성을 가지고 있으며 string 문자열에 대한 작업(예를 들어 연결, Trim() 등)은 메모리에 새로운 문자열 대상을 생성합니다. 문자열을 빈번하게 수정하는 상황에서 For 순환에서 작업하는 등 빈번하게 새로운 문자열 대상을 생성하여 시스템의 불필요한 비용을 초래합니다.그래서 이런 상황에서 문자열을 어떻게 조작하는지 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 유형에 대한 조작은 새로운 메모리에 새로운 문자열을 신청하여 일반적인 영향은 크지 않지만 대량의 문자열 조작, 예를 들어 순환체에서 발생하는 시스템 비용은 무시할 수 없다.
처음으로 자신의 생각으로 박문을 썼는데 실수가 있기 마련입니다. 잘못된 점이 있으면 바로잡아야 합니다. 감사합니다!

좋은 웹페이지 즐겨찾기