StringBuilder рдЕрддреАрдд рдФрд░ рд╡рд░реНрддрдорд╛рди

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдореЗрд░рд╛ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ .NET рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред рдпрд╣ рд▓реЗрдЦ рдкрд░рдВрдкрд░рд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд▓ рдХреНрд▓рд╛рд╕ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, .NET рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ (рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛), рдФрд░ рдЗрд╕рд▓рд┐рдП, рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдирдЯреЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрд╢рди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдЧрдВрднреАрд░ рдореЗрдореЛрд░реА рд▓реЛрдб рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

string s = string.Empty; for (int i = 0; i < 100; i++) { s += "T"; } 

рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдмреБрд░рд╛ рдХреНрдпрд╛ рд╣реИ? рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рд▓рдВрдмреА рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдкреБрд░рд╛рдиреА рд░реЗрдЦрд╛ рд╕реЗ рд╡рд░реНрдгреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╢рд╛рдорд┐рд▓ рд╡рд░реНрдгреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:


рдпрд╣ рд╕реВрддреНрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдЧрддрд┐ рдХрд╛ рдпреЛрдЧ рд╣реИ:

рдпрд╣реА рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЙрдиреНрд╕реЗрдкреНрдЯрди рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ O (n 2 ) рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, n рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред

рдРрд╕реЗ рдХреЛрдб рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо StringBuilder рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдореЗрдореЛрд░реА рдЕрдкрд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, StringBuilder рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред

 var strB = new StringBuilder(); for (int i = 0; i < 100; i++) { strB.Append("T"); } string str = strB.ToString(); 

рдРрд╕рд╛ рдХреЛрдб, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рднреА рджреЛрд╖реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ, рдФрд░ рд╣рд╡рд╛ рдореЗрдВ рдХреБрдЫ рд╕реНрдореГрддрд┐ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрдпрдорд┐рдд рд╣реИред

StringBuilder рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ .NET 4.0 рдореЗрдВ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реБрдЖред

.NET 2.0 рдореЗрдВ StringBuilder


.NET 2.0 рдореЗрдВ StringBuilder рд╡рд░реНрдЧ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ:

 public sealed class StringBuilder : ISerializable { internal const int DefaultCapacity = 16; private const string CapacityField = "Capacity"; private const string MaxCapacityField = "m_MaxCapacity"; private const string StringValueField = "m_StringValue"; private const string ThreadIDField = "m_currentThread"; internal IntPtr m_currentThread; internal int m_MaxCapacity; internal volatile string m_StringValue; <------------------------------------- } 

m_currentThread - рдЙрд╕ рдереНрд░реЗрдб рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛;
m_MaxCapacity - рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рдЕрдзрд┐рдХрддрдо рдХреНрд╖рдорддрд╛;
m_StringValue рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдг рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, StringBuilder рд╡рд░реНрдЧ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ mscorlib.dll рдХреА рдУрд░ рдХреЗ рддрд╛рд░ рдкрд░рд╕реНрдкрд░ рднрд┐рдиреНрди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП StringBuilder рдиреЗ m_StringValue рдореЗрдВ рд╕реНрдерд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓рдВрдмрд╛рдИ 16 рд╡рд░реНрдг рд╣реИ, рдФрд░ рдпрджрд┐ рдирдП рд╡рд░реНрдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ StringBuilder рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджреЛ рдмрд╛рд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЖрдВрддрд░рд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЬрдЧрд╣ рд▓реЗрддреА рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реЗ + рдирдП рд▓реЛрдЧреЛрдВ рд╕реЗ рдирдП рдмрдирд╛рдП рдЧрдП рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддреА рд╣реИред рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рджреЛрдЧреБрдиреА рд╣реЛрдиреЗ рд╕реЗ рд░реИрдЦрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ (O (n)) рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рджреНрд╡рд┐рдШрд╛рдд рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рддрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддрд╛ рд╣реИред

StringBuilder рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛ рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рдмрд╛рд╣рд░ рдЖрдХрд╛рд░ рдФрд░ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдПрдХ рдФрд░ рджреЛрд╣рд░реАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
  public StringBuilder Append(string value) { if (value == null) return this; string currentString = this.m_StringValue; IntPtr currentThread = Thread.InternalGetCurrentThread(); if (this.m_currentThread != currentThread) currentString = string.GetStringForStringBuilder(currentString, currentString.Capacity); int length = currentString.Length; int requiredLength = length + value.Length; if (this.NeedsAllocation(currentString, requiredLength)) //       { //    2          string newString = this.GetNewString(currentString, requiredLength); newString.AppendInPlace(value, length); this.ReplaceString(currentThread, newString); //    } else { currentString.AppendInPlace(value, length); this.ReplaceString(currentThread, currentString); } return this; } 


рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╕ рдпрд╣ рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдирдИ рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╕ рд▓рд╛рдЗрди рдХреЗ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╣рд┐рд╕реНрд╕реЗ рдХреА рдЬрдЧрд╣ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдХрд╛рд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдФрд░ рдкреБрд░рд╛рдиреА рдФрд░ рдирдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред

рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
  public StringBuilder Insert(int index, string value) { if (value == null) return this.Insert(index, value, 0); else return this.Insert(index, value, 1); } public StringBuilder Insert(int index, string value, int count) { IntPtr tid; string threadSafeString = this.GetThreadSafeString(out tid); int length = threadSafeString.Length; if (value != null && value.Length != 0) { if (count != 0) { int requiredLength; try { requiredLength = checked (length + value.Length * count);//    } catch (OverflowException ex) { throw new OutOfMemoryException(); } if (this.NeedsAllocation(threadSafeString, requiredLength))//       { //    2          string newString = this.GetNewString(threadSafeString, requiredLength); newString.InsertInPlace(index, value, count, length, requiredLength);//   this.ReplaceString(tid, newString);//    } else { threadSafeString.InsertInPlace(index, value, count, length, requiredLength); this.ReplaceString(tid, threadSafeString); } return this; } } return this; } 


рдпрд╣ рд╡рд┐рдзрд┐, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддрд░рд╣, рдпрд╣ рдЬрд╛рдБрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдИ рд▓рд╛рдЗрди рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рд▓рд╛рдЗрди рдХрд╛ рдЖрдХрд╛рд░ рджреЛрдЧреБрдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдЖрдХрд╛рд░ рдореЗрдВ рдмрд┐рдирд╛ рдореВрд▓ рд░реЗрдЦрд╛ рдХреЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдирд┐рдХрд╛рд▓реЗрдВ () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
 public StringBuilder Remove(int startIndex, int length) { IntPtr tid; string threadSafeString = this.GetThreadSafeString(out tid); int length1 = threadSafeString.Length; //  ,      threadSafeString.RemoveInPlace(startIndex, length, length1); this.ReplaceString(tid, threadSafeString);//    return this; } 


рдпрд╣ рд╡рд┐рдзрд┐ рд╢реЗрд╖ рд░реЗрдЦрд╛ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдХрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред рдЬрдм рдЖрдк рдЕрдВрддрд┐рдо рд╡рд░реНрдг рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдВрдд рд╕реЗ рд╣рдЯрд╛рдирд╛ рдкрдВрдХреНрддрд┐ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред

ToString () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
 public override string ToString() { string str = this.m_StringValue; if (this.m_currentThread != Thread.InternalGetCurrentThread() || 2 * str.Length < str.ArrayLength) return string.InternalCopy(str);//   str.ClearPostNullChar(); this.m_currentThread = IntPtr.Zero; return str; //     } 


рдпрд╣ рд╡рд┐рдзрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдпрд╛ рдЙрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдкрд╣рд▓рд╛ рдХреЙрд▓ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рдХреЙрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред .NET 2.0 рдореЗрдВ StringBuilder рд╡рд░реНрдЧ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЧрддрд┐ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, .NET 2.0 рдореЗрдВ StringBuilder рд╡рд░реНрдЧ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдирдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛрдЧреБрдиреА рд╣реИред рд▓рдВрдмрд╛рдИ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдРрд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп рд╕реНрдореГрддрд┐ рдореЗрдВ рд░реИрдЦрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреНрд╡рд┐рдШрд╛рдд рд╕реЗ рдмреЗрд╣рддрд░ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрдбрд╝реА рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде, рдпрд╣ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ, рдЗрд╕рдХреЗ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╕рд░ рдмрдбрд╝реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (LOH) рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдЪреНрдЫрд╛ рднреА рд╣реИред

.NET 4.0 рдореЗрдВ StringBuilder


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, .NET 4.0 рдореЗрдВ StringBuilder рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЕрдм, рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдЪрд╛рд░ [] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрдЧ рд╕реНрд╡рдпрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧрдмреНрдпреВрд▓реНрдбрд░реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреАрдмрджреНрдз рд╕реВрдЪреА рд╣реИ рдЬреИрд╕реЗ рд░реЛрдкрд╕реНрдЯреНрд░реАрдорд┐рдВрдЧред

рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░рдг рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрдо рд╣реЛрдиреЗ рдкрд░ рдореЗрдореЛрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ ToString () рд╡рд┐рдзрд┐ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рддрд╛рд░ рдкрд╣рд▓реЗ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рд╡рд┐рдзрд┐ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ StringBuilder рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ: Append () рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓, рдФрд░ рдлрд┐рд░ ToString () рдореЗрдВ рдПрдХ рдХреЙрд▓ред

.NET 4.0 рдореЗрдВ StringBuilder рд╡рд░реНрдЧ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ:

 public sealed class StringBuilder : ISerializable { internal const int DefaultCapacity = 16; internal const int MaxChunkSize = 8000; internal char[] m_ChunkChars; <------------------------------------- internal StringBuilder m_ChunkPrevious; <------------------------------------- internal int m_ChunkLength; internal int m_ChunkOffset; internal int m_MaxCapacity; private const string CapacityField = "Capacity"; private const string MaxCapacityField = "m_MaxCapacity"; private const string StringValueField = "m_StringValue"; private const string ThreadIDField = "m_currentThread"; } 

m_ChunkChars - рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛) рдХреЗ рдкрд╛рддреНрд░реЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╕рд░рдгреА;
m_ChunkPrepret - рд╕реВрдЪреА рдореЗрдВ рдкрд┐рдЫрд▓реЗ рддрддреНрд╡ ( рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд▓ ) рд╕реЗ рд▓рд┐рдВрдХ;
m_ChunkLength - рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдВрдмрд╛рдИ (рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛);
m_ChunkOffset - рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд рд╡рд░реНрдгреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ (рддрд╛рд░реНрдХрд┐рдХ рд▓рдВрдмрд╛рдИ);
m_MaxCapacity - StringBuilder рдХреЗ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдХреА рдЕрдзрд┐рдХрддрдо рдХреНрд╖рдорддрд╛ред

.NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4 рдФрд░ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдореЗрдВ, рдЬрдм рдЖрдк StringBuilder рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (Int32, Int32) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ StringBuilder рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрд╕реНрдЯрд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ StringBuilder рдЙрджрд╛рд╣рд░рдг рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдХреНрд╖рдорддрд╛ рдЗрд╕рдХреА MaxCapacity рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдкрд░реЗ рдмрдврд╝ рд╕рдХрддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдПрдкреЗрдВрдб рдФрд░ рдПрдкреЗрдВрдбрдлрд╛рд░реНрдо рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВред

MaxChunkSize рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ 8000 рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдБ рд╡рд░реНрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ:

рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк (<85K рдмрд╛рдЗрдЯреНрд╕ ~ 40K рдЪрд╛рд░реНрдЯ) рд╕реЗ рдмрд╛рд╣рд░ рдЪрдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрддрдо рдЪрдВрдХ рдЖрдХрд╛рд░ рдмрдбрд╝рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рдХрдо рдЖрд╡рдВрдЯрди рдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкреНрд░рдпреБрдХреНрдд рдкрд╛рддреНрд░реЛрдВ рдФрд░ рдзреАрдореА рдЖрд╡реЗрд╖рдг / рдЬрдЧрд╣ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрдкрд╢рд┐рд╖реНрдЯ рднреАред

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░рд┐рддреНрд░ рд╕рд░рдгреА рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдореЗрдВ рди рдкрдбрд╝реЗред рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ (рдЯреБрдХрдбрд╝рд╛) рдмрдбрд╝рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдХрдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╡рд░реНрдг рдЕрдкреНрд░рдпреБрдХреНрдд рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд / рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
 public unsafe StringBuilder Append(string value) { if (value != null) { char[] chArray = this.m_ChunkChars; int index = this.m_ChunkLength; int length = value.Length; int num = index + length; if (num < chArray.Length)//           { if (length <= 2) { if (length > 0) chArray[index] = value[0]; if (length > 1) chArray[index + 1] = value[1]; } else { fixed (char* smem = value) fixed (char* dmem = &chArray[index]) string.wstrcpy(dmem, smem, length); } this.m_ChunkLength = num; } else this.AppendHelper(value); } return this; } private unsafe void AppendHelper(string value) { fixed (char* chPtr = value) this.Append(chPtr, value.Length); } internal unsafe StringBuilder Append(char* value, int valueCount) { //  int num1 = valueCount + this.m_ChunkLength; if (num1 <= this.m_ChunkChars.Length) { StringBuilder.ThreadSafeCopy(value, this.m_ChunkChars, this.m_ChunkLength, valueCount); this.m_ChunkLength = num1; } else { //   () int count = this.m_ChunkChars.Length - this.m_ChunkLength; if (count > 0) { StringBuilder.ThreadSafeCopy(value, this.m_ChunkChars, this.m_ChunkLength, count); this.m_ChunkLength = this.m_ChunkChars.Length; } //  ,     int num2 = valueCount - count; this.ExpandByABlock(num2); //    () StringBuilder.ThreadSafeCopy(value + count, this.m_ChunkChars, 0, num2); this.m_ChunkLength = num2; } return this; } 


рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ: рдпрджрд┐ рдирдИ рд╕реВрдЪреА рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рддрддреНрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд░реНрдг рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реЛрддреА рд╣реИ; рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЬрд┐рд╕ рднрд╛рдЧ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдФрд░ рдЬреЛ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛, рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕реВрдЪреА рддрддреНрд╡ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ; StringBuilder-a) рдХрд╛ рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕рдХреА рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдкреВрд░реЗ рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рдпрд╛ рд╢реЗрд╖ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬреЛ рднреА рдЕрдзрд┐рдХ рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рд╕рд░рдгреА рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ 8000 рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдирдИ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реВрддреНрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 int length = Math.Max(minBlockCharCount, Math.Min(this.Length, 8000)) 

рдЬрд╣рд╛рдВ minBlockCharCount рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдХреА рд╢реЗрд╖ рд▓рдВрдмрд╛рдИ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд░рдЦреА рдЧрдИ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк

 StringBuilder s = new StringBuilder (); for (int i = 0; i < 10000; i++) { s.Append ("T"); } 

рд╕реВрдЪреА рдорджреЛрдВ рдХреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ: 8000 , 4092, 2048, 1024, 512, 256, 128, 64, 32, 16, 16 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред

рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдЗрддрдиреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде, рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдг рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд▓рдЧрднрдЧ рдУ (1) рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдЪреА рдХреЗ рдХрдИ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВред

рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
 public unsafe StringBuilder Insert(int index, string value) { if (value != null) { fixed (char* chPtr = value) this.Insert(index, chPtr, value.Length); } return this; } private unsafe void Insert(int index, char* value, int valueCount) { if (valueCount <= 0) return; StringBuilder chunk; int indexInChunk; //          (StringBuilder) this.MakeRoom(index, valueCount, out chunk, out indexInChunk, false); this.ReplaceInPlaceAtChunk(ref chunk, ref indexInChunk, value, valueCount); } 


рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ () рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ: рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рдЖрдЗрдЯрдо (StringBuilder) рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рд╣реИ, рддреЛ рдирдП рдкрд╛рда рдХреЛ рд╕реНрдерд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╡рд░реНрдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдПрдХ рдирдИ рд╕реВрдЪреА рдЖрдЗрдЯрдо (StringBuilder) рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЖрдЗрдЯрдо рд╕реЗ рд╡рд░реНрдгреЛрдВ рдХрд╛ рд╡рд╣ рднрд╛рдЧ рдЬреЛ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛, рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдЕрдХреНрд╖рд░ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдРрд╕реЗ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

 StringBuilder s = new StringBuilder (); for (int i = 0; i < 10000; i++) { s.Insert (0, "T"); } 

рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рдФрд░ рдмрд╣реБрдд рдЧрдВрднреАрд░рддрд╛ рд╕реЗ!

рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд╛рдЗрд▓реНрдбрд░реНрд╕ рдХреА рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдХрд┐ 16 рд╡рд░реНрдг рд▓рдВрдмрд╛ рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрд░рд┐рддреНрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрд░реНрдерд╛рддреН, рдУ (рдПрди) рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рдХрд╛рд▓реЗрдВ () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
 public StringBuilder Remove(int startIndex, int length) { if (this.Length == length && startIndex == 0) { // .     . this.Length = 0; return this; } else { if (length > 0) { StringBuilder chunk; int indexInChunk; this.Remove(startIndex, length, out chunk, out indexInChunk); } return this; } } private void Remove(int startIndex, int count, out StringBuilder chunk, out int indexInChunk) { int num = startIndex + count; //  ()         . chunk = this; StringBuilder stringBuilder = (StringBuilder) null; int sourceIndex = 0; while (true) { if (num - chunk.m_ChunkOffset >= 0) { if (stringBuilder == null) { stringBuilder = chunk; sourceIndex = num - stringBuilder.m_ChunkOffset; } if (startIndex - chunk.m_ChunkOffset >= 0) break; } else chunk.m_ChunkOffset -= count; chunk = chunk.m_ChunkPrevious; } indexInChunk = startIndex - chunk.m_ChunkOffset; int destinationIndex = indexInChunk; int count1 = stringBuilder.m_ChunkLength - sourceIndex; //       if (stringBuilder != chunk) { destinationIndex = 0; //    startIndex     () chunk.m_ChunkLength = indexInChunk; //       . stringBuilder.m_ChunkPrevious = chunk; stringBuilder.m_ChunkOffset = chunk.m_ChunkOffset + chunk.m_ChunkLength; //                () if (indexInChunk == 0) { stringBuilder.m_ChunkPrevious = chunk.m_ChunkPrevious; chunk = stringBuilder; } } stringBuilder.m_ChunkLength -= sourceIndex - destinationIndex; if (destinationIndex == sourceIndex) //     return; //          StringBuilder.ThreadSafeCopy(stringBuilder.m_ChunkChars, sourceIndex, stringBuilder.m_ChunkChars, destinationIndex, count1); } 


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд╛рддреНрд░реЛрдВ рдХреА рдирдХрд▓ рдХреА, рдЙрдиреНрд╣реЗрдВ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдпрд╣рд╛рдВ рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ (рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд▓) рдХреА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рдПрдХ рдСрдлрд╕реЗрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

ToString () рд╡рд┐рдзрд┐

рд╕реНрд░реЛрдд рдХреЛрдб
 public override unsafe string ToString() { if (this.Length == 0) return string.Empty; string str = string.FastAllocateString(this.Length); StringBuilder stringBuilder = this; fixed (char* chPtr = str) { do { if (stringBuilder.m_ChunkLength > 0) { char[] chArray = stringBuilder.m_ChunkChars; int num = stringBuilder.m_ChunkOffset; int charCount = stringBuilder.m_ChunkLength; fixed (char* smem = chArray) string.wstrcpy(chPtr + num, smem, charCount); } stringBuilder = stringBuilder.m_ChunkPrevious; } while (stringBuilder != null); } return str; } 


рдпрд╣ рд╡рд┐рдзрд┐ StringBuilders рдХреА рдкреВрд░реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рддреА рд╣реИ рдФрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреА рд╣реИред

рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛


рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╡рд░реНрдЧ рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рд╣реИред

рдЯреЗрд╕реНрдЯ 1. рджреА рдЧрдИ рд▓рдВрдмрд╛рдИ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЫреЛрдЯреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде, рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреБрд░рд╛рдиреЗ рдХреЛ рдЦреЛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ (StringBuilder) рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛рдИ, рдХреНрд╖рдорддрд╛, рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ + рдУрд╡рд░рд╣реЗрдб рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ 16384 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдкреБрд░рд╛рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рд▓рд╛рдЗрди рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рдореЗрдВ рдХрдИ рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред

рдкрд░реАрдХреНрд╖рдг 2. рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рд╡рд┐рдзрд┐



рд╢рд╛рдпрдж рдпрд╣ рд╡рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреАрддрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЕрдм рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ, рд▓рдЧрднрдЧ рджреЛ рдмрд╛рд░ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, 1.8 рдмрд╛рд░) рдХреА рдЬрд╛рддреА рд╣реИред

рдкрд░реАрдХреНрд╖рдг 3. рд╕рдореНрдорд┐рд▓рд┐рдд () рд╡рд┐рдзрд┐

рд╣рдо рдкрд╣рд▓реЗ рд╣реА рд╡рд░реНрдгреЛрдВ рд╕реЗ рднрд░реЗ рд╣реБрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд▓реЗрдВрдЧреЗ, 1000 рд╡рд░реНрдг рд▓рдВрдмреЗред

1. рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓реЗрдВ



2. рдкрдВрдХреНрддрд┐ рдХреЗ рдмреАрдЪ рдореЗрдВ рдбрд╛рд▓реЗрдВ



3. рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ



рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИрдВ - рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣реАрдВ рднреА рдЪрд┐рдкрдХрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╣рд╛рд░ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг 4. рдирд┐рдХрд╛рд▓реЗрдВ () рд╡рд┐рдзрд┐

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгреЛрдВ рд╕реЗ рднрд░реЗ рд╣реБрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ 10 рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ, рдЬрдм рддрдХ рд╣рдо рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗред



рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдЬреАрддрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╢реЗрд╖ рдкрдВрдХреНрддрд┐ рдХреЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдФрд░ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдирд╣реАрдВ)ред

рдкрд░реАрдХреНрд╖рдг 5. рд╡рд┐рдзрд┐ ToString ()

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдзрд┐ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЦреЛ рджреЗрддреА рд╣реИред рдкрд┐рдЫрд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрд╕ рд▓рд╛рдЗрди рдХреА рдПрдХ рд▓рд┐рдВрдХ рдХреЛ рд▓реМрдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░), рдФрд░ рдирдП рдХреЛ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рд▓рд╛рдЗрди рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдпрджрд┐ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдИ рдЧрдИ рдереА, рддреЛ рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдЪреА рдореЗрдВ 16 рд╡рд░реНрдгреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдХрдИ рддрддреНрд╡ (StringBuilders) рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред

рдкрд░реАрдХреНрд╖рдг 6. рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ StringBuilder рдЕрдм рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдорд╣рдВрдЧрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЗрд╕реЗ рдЗрдиреНрд╕рд░реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдЯреЗрд╕реНрдЯ 7. рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдп: рдПрдкреЗрдВрдб () рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЙрд▓, рдФрд░ рдлрд┐рд░ ToString рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ ()

рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рдПрдкреЗрдВрдб () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрд▓, рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рдХреЙрд▓ рдЯреВрд╕реНрдЯреНрд░рд┐рдВрдЧ ()ред рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдЯреАрдХ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред



рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, .NET 2.0 рдореЗрдВ StringBuilder рд╡рд░реНрдЧ рдХреЛ ToString () рд╡рд┐рдзрд┐ рдХреА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ .NET 4.0 рдореЗрдВ рдЗрд╕реЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рд╡рд┐рдзрд┐ рдХреА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рд╢рд┐рд╖реНрдЯ () рдкрджреНрдзрддрд┐ рдХрд╛ рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ, рдЬрдмрдХрд┐ рдЗрдиреНрд╕рд░реНрдЯ () рдФрд░ рдЯреНрдпреВрд░рд┐рдВрдЧ () рд╡рд┐рдзрд┐рдпрд╛рдБ рдзреАрдореА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдХрдИ рдмрд╛рд░ рдПрдкреЗрдВрдб () рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рдЯреЛрд╕реНрдЯреНрд░рд┐рдВрдЧ () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред

рдХрдХреНрд╖рд╛ рдХреЗ рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрд▓ рдЕрдкреЗрдВрдбреЗрдб () рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, рдХрдХреНрд╖рд╛ рдХреЛ рдЕрдм StringAppender * рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

Source: https://habr.com/ru/post/In172689/


All Articles