.NET Framework 4.0 (VS 2010) 修改了 StringBuilder.EnsureCapacity 的擴容策略。舊版(.NET 2.0/3.5)採用「倍增補足」:先將容量加倍,若仍小於需求則取需求值;新版直接配置精確需求值。本文驗證差異並分析影響。
StringBuilder sb = new StringBuilder("Hello Kitty!"); // Length=12, Capacity=16 (預設)
sb.EnsureCapacity(28); // 要求 28
Console.WriteLine($"Capacity = {sb.Capacity}"); // 輸出 32 (16*2=32 > 28)

StringBuilder sb = new StringBuilder("Hello Kitty!"); // Length=12, Capacity=16
sb.EnsureCapacity(28);
Console.WriteLine($"Capacity = {sb.Capacity}"); // 輸出 28 (精確配置)

| 場景 | .NET 3.5 舊策略 | .NET 4.0 新策略 |
|---|---|---|
| 需求 ≤ 目前容量 | 不變 | 不變 |
| 需求 > 目前容量 | max(目前容量*2, 需求) | 需求值 |
EnsureCapacity 呼叫點,確認邏輯不依賴「容量必為 2 的冪次」假設。.NET 4.0 StringBuilder.cs 相關片段:
public int EnsureCapacity(int capacity)
{
if (capacity < 0) throw new ArgumentOutOfRangeException(...);
if (capacity > this.Capacity)
{
// 新策略:直接配置需求值(對齊至記憶體管理器粒度)
Capacity = capacity;
}
return this.Capacity;
}
舊版邏輯約為:
int newCapacity = this.Capacity * 2;
if (newCapacity < capacity) newCapacity = capacity;
Capacity = newCapacity;
此變更屬於 .NET 4.0 基礎類別庫優化之一,傾向於「精確配置、減少浪費」。絕大多數應用無感知,僅極少數高效能、大字串、互操作場景需驗證。升級專案時,可在單元測試中加入 Capacity 斷言確保行為預期。