Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức StringBuilder.EnsureCapacity() trong C#

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 > Capacity hiệ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 ≤ Capacity hiện tại: Không làm gì, trả về Capacity hiện tại.
  • Không bao giờ giảm Capacity (dùng TrimExcess trê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