เมธอด StringBuilder.EnsureCapacity() ใน C# ใช้รับประกันว่าความจุ (Capacity) ของ instance StringBuilder นั้นจะมีอย่างน้อยเท่ากับค่าที่ระบุ หากความจุปัจจุบันน้อยกว่าค่าที่ระบุ จะขยาย buffer ให้เพียงพอ
รูปแบบไวยากรณ์ (Syntax)
public int EnsureCapacity(int capacity);
capacity: ความจุขั้นต่ำที่ต้องการรับประกัน- คืนค่า : ความจุใหม่หลังจากการปรับ (อาจมากกว่าที่ระบุ)
ตัวอย่างที่ 1: การเพิ่มความจุและ CopyTo
using System;
using System.Text;
public class Demo
{
public static void Main()
{
StringBuilder strBuilder = new StringBuilder("jhbjhb");
Console.WriteLine("String = " + strBuilder);
Console.WriteLine("StringBuilder capacity = " + strBuilder.Capacity);
strBuilder.EnsureCapacity(20);
Console.WriteLine("StringBuilder capacity = " + strBuilder.Capacity);
char[] arr = new char[5] { 'a', 'b', 'c', 'd', 'e' };
strBuilder.CopyTo(1, arr, 1, 3);
Console.WriteLine("\nCopied String in char array...");
Console.WriteLine(arr); // ahbje
}
}
ผลลัพธ์
String = jhbjhb StringBuilder capacity = 16 StringBuilder capacity = 20 Copied String in char array... ahbje
ตัวอย่างที่ 2: วงจรชีวิตของ Capacity และ Length
using System;
using System.Text;
public class Demo
{
public static void Main()
{
StringBuilder strBuilder = new StringBuilder("Katie");
Console.WriteLine("String = " + strBuilder);
Console.WriteLine("\nStringBuilder capacity = " + strBuilder.Capacity);
Console.WriteLine("StringBuilder length = " + strBuilder.Length);
strBuilder.EnsureCapacity(35);
Console.WriteLine("\nStringBuilder capacity = " + strBuilder.Capacity);
Console.WriteLine("StringBuilder length = " + strBuilder.Length);
strBuilder.EnsureCapacity(0); // ไม่ลดความจุลง (เพราะ 0 น้อยกว่าปัจจุบัน)
strBuilder.Length = 0; // ตั้งค่าความยาวเป็น 0
Console.WriteLine("\nStringBuilder capacity = " + strBuilder.Capacity);
Console.WriteLine("StringBuilder length = " + strBuilder.Length);
}
}
ผลลัพธ์
String = Katie StringBuilder capacity = 16 StringBuilder length = 5 StringBuilder capacity = 35 StringBuilder length = 5 StringBuilder capacity = 35 StringBuilder length = 0
สรุปและข้อสังเกต
EnsureCapacity()ไม่ลดความจุ ลงได้ แค่เพิ่มขึ้นเมื่อจำเป็น- ความจุเริ่มต้นคือ 16 ตัวอักษร (หากไม่ระบุใน constructor)
- การตั้งค่า
Length = 0จะล้างเนื้อหา แต่ ไม่ลด Capacity - ใช้ EnsureCapacity() ก่อนเพิ่มข้อมูลจำนวนมาก เพื่อลดการจัดสรรหน่วยความจำซ้ำ (performance)
- คืนค่าความจุจริงหลังปรับปรุง (อาจมากกว่าที่ขอ เนื่องจากกลไกการขยายแบบสองเท่า)