Phương thức StringBuilder.EnsureCapacity() trong C# được dùng để đảm bảo rằng dung lượng (capacity) của instance StringBuilder hiện tại lớn hơn hoặc bằng giá trị được chỉ định. Nếu dung lượng hiện tại đã đủ lớn, phương thức không làm gì.
Cú pháp
public int EnsureCapacity(int capacity);
capacity: Dung lượng tối thiểu cần đảm bảo.
Trả về: Dung lượng mới của StringBuilder (sau khi điều chỉnh nếu có).
Ví dụ 1: Tăng dung lượng và CopyTo
using System;
using System.Text;
public class Demo
{
public static void Main()
{
StringBuilder strBuilder = new StringBuilder("jhbjhb");
Console.WriteLine("Chuỗi = " + strBuilder);
Console.WriteLine("Dung lượng = " + strBuilder.Capacity);
// Yêu cầu dung lượng ít nhất 20
strBuilder.EnsureCapacity(20);
Console.WriteLine("Dung lượng sau EnsureCapacity(20) = " + strBuilder.Capacity);
// Copy một phần sang mảng char
char[] arr = new char[5] { 'a', 'b', 'c', 'd', 'e' };
strBuilder.CopyTo(1, arr, 1, 3);
Console.WriteLine("\nChuỗi đã copy vào mảng char...");
Console.WriteLine(arr); // ahbje
}
}
Kết quả
Chuỗi = jhbjhb Dung lượng = 16 Dung lượng sau EnsureCapacity(20) = 20 Chuỗi đã copy vào mảng char... ahbje
Ví dụ 2: Quản lý dung lượng chi tiết
using System;
using System.Text;
public class Demo
{
public static void Main()
{
StringBuilder strBuilder = new StringBuilder("Katie");
Console.WriteLine("Chuỗi = " + strBuilder);
Console.WriteLine("\nDung lượng = " + strBuilder.Capacity);
Console.WriteLine("Độ dài = " + strBuilder.Length);
strBuilder.EnsureCapacity(35);
Console.WriteLine("\nDung lượng sau EnsureCapacity(35) = " + strBuilder.Capacity);
Console.WriteLine("Độ dài = " + strBuilder.Length);
// EnsureCapacity(0) không thu nhỏ dung lượng
strBuilder.EnsureCapacity(0);
strBuilder.Length = 0; // Xóa nội dung
Console.WriteLine("\nDung lượng sau xóa = " + strBuilder.Capacity);
Console.WriteLine("Độ dài sau xóa = " + strBuilder.Length);
}
}
Kết quả
Chuỗi = Katie Dung lượng = 16 Độ dài = 5 Dung lượng sau EnsureCapacity(35) = 35 Độ dài = 5 Dung lượng sau xóa = 35 Độ dài sau xóa = 0
Capacity vs Length
| Thuộc tính | Ý nghĩa |
|---|---|
Length |
Số ký tự thực tế đang chứa |
Capacity |
Số ký tự tối đa có thể chứa mà không cần cấp phát lại bộ nhớ |
Hành vi của EnsureCapacity
- Nếu
capacity>Capacityhiện tại: Cấp phát bộ nhớ mới (thường gấp đôi hoặc bằng giá trị yêu cầu). - Nếu
capacity≤Capacityhiện tại: Không làm gì, trả về Capacity hiện tại. - Không bao giờ giảm Capacity (dùng
TrimExcesstrên List, nhưng StringBuilder không có).
Khi nào nên dùng?
- Biết trước kích thước xấp xỉ chuỗi kết quả (tránh reallocation nhiều lần).
- Xây dựng chuỗi lớn trong vòng lặp:
sb.EnsureCapacity(estimatedSize)trước khi Append. - Tối ưu hiệu suất khi ghi file, network, log...
Mẹo
Khởi tạo StringBuilder với dung lượng ban đầu:
var sb = new StringBuilder(1000); // Capacity = 1000 từ đầu