对于StringBuilder自动分配空间的疑惑
有很多朋友提出,StringBuilder中Capacity的值是成倍扩充的,但是我今天使用StringBuilder的时候发现了在某些情况下其Capacity不是成倍扩充的,望高手能给出解释,谢谢!下面是具体代码及执行结果
System.Text.StringBuilder sb = new System.Text.StringBuilder();
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
sb.Append('1',16);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
sb.Append('2',32);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
sb.Append('3',64);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
try
{
sb.Remove(0,sb.Length);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
sb.Capacity = 1;
sb.Append('a',2);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
sb.Append('b',4);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
sb.Append('c',6);
Console.WriteLine("Capacity:" + sb.Capacity);
Console.WriteLine("Length:" + sb.Length);
}
catch(ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
return;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
Console.ReadLine();
其执行结果是:
Capacity:16 Length:0
Capacity:16 Length:16
Capacity:49 Length:48
Capacity:113 Length:112
Capacity:113 Length:0
Capacity:3 Length:2
Capacity:7 Length:6
Capacity:14 Length:12