Trong C#, chuỗi (string) là bất biến (immutable). Nghĩa là không thể sửa đổi chuỗi sau khi tạo. Mọi sửa đổi trả về chuỗi mới, chuỗi gốc không đổi.
string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // aaabbbccc
Console.WriteLine(newWord); // aaadddccc
Lớp StringBuilder đại diện cho đối tượng giống chuỗi có thể sửa đổi (mutable string of characters). Nó triển khai khác với kiểu string bất biến.
Việc sửa đổi chuỗi tạo bản sao, lặp lại nhiều lần gây hao hiệu năng. StringBuilder cung cấp cách hiệu quả để sửa đổi chuỗi bằng cách thêm, xóa, thay thế, chèn ký tự.
StringBuilder duy trì bộ đệm (buffer) nội部. Nếu còn chỗ, thêm dữ liệu mới. Ngược lại, cấp phát buffer mới, sao chép dữ liệu cũ, rồi thêm dữ liệu mới.
var sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
sb.Append("a");
}
Console.WriteLine(sb.ToString()); // aaaaaaaaaa
Các cách khởi tạo StringBuilder
// Mặc định
var sb1 = new StringBuilder();
// Với dung lượng ban đầu
var sb2 = new StringBuilder(capacity: 10);
// Với chuỗi ban đầu
var sb3 = new StringBuilder(value: "Hello World");
// Với dung lượng và dung lượng tối đa
var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50);
// Với chuỗi và dung lượng
var sb5 = new StringBuilder(value: "Hello", capacity: 20);
// Từ chuỗi con và dung lượng
var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
StringBuilder có thuộc tính Length (số ký tự hiện tại) và Capacity (sức chứa tối đa hiện tại). Khi Length vượt Capacity, cấp phát bộ nhớ mới, gấp đôi capacity. Tiếp tục cấp phát động cho đến khi đạt MaxCapacity. Sau đó không cấp phát thêm, ném ArgumentOutOfRangeException hoặc OutOfMemoryException.
Các phương thức chính
- Append - Thêm biểu diễn chuỗi của đối tượng
- AppendFormat - Thêm chuỗi định dạng composite
- AppendJoin - Nối mảng với separator rồi thêm vào
- AppendLine - Thêm dòng mới
- Clear - Xóa tất cả ký tự
- CopyTo - Sao chép ký tự sang mảng/span
- EnsureCapacity - Đảm bảo capacity tối thiểu
- Equals - So sánh chuỗi, Capacity, MaxCapacity
- GetChunks - Duyệt các khối ký tự
- Insert - Chèn tại vị trí chỉ định
- Remove - Xóa phạm vi ký tự
- Replace - Thay thế ký tự/chuỗi
- ToString - Chuyển thành string
Ví dụ
using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // aaabbbccc
Console.WriteLine(newWord); // aaadddccc
var sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
sb.Append("a");
}
Console.WriteLine(sb.ToString()); // aaaaaaaaaa
}
}
Kết quả đầu ra
aaabbbccc
aaadddccc
aaaaaaaaaa