Computer >> Máy Tính >  >> Lập trình >> C#

Mục đích của lớp StringBuilder trong C # là gì?

Trong C #, chuỗi là bất biến. Điều đó có nghĩa là bạn không thể sửa đổi một chuỗi sau khi nó được tạo. Bất kỳ sửa đổi nào đối với chuỗi đều trả về một chuỗi mới có chứa sửa đổi, giữ nguyên chuỗi ban đầu.

string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // prints aaabbbccc
Console.WriteLine(newWord); // prints aaadddccc

Lớp StringBuilder đại diện cho một đối tượng dạng chuỗi có thể được sửa đổi, tức là một chuỗi ký tự có thể thay đổi. Nó được triển khai khác với kiểu chuỗi, đại diện cho một chuỗi ký tự bất biến.

Khi sửa đổi một đối tượng chuỗi sẽ tạo ra một bản sao, việc sửa đổi nhiều lần các đối tượng chuỗi có thể bị phạt về hiệu suất. Đối với những lần lặp lại nhỏ, nó không đáng kể, nhưng có thể có ý nghĩa đối với những vòng lặp lớn. StringBuilder cung cấp một giải pháp thay thế hiệu quả để sửa đổi một chuỗi bằng cách thêm, bớt, thay thế hoặc chèn các ký tự.

StringBuilder duy trì một bộ đệm bên trong để giữ các ký tự. Nếu có không gian trống trong bộ đệm, nó sẽ thêm dữ liệu mới. Nếu không, nó sẽ tạo một bộ đệm mới, sao chép dữ liệu cũ vào bộ đệm mới, sau đó gắn dữ liệu vào.

var sb = new StringBuilder();
for (int i = 0; i < 10; i++){
   sb.Append("a");
}
Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa

Dưới đây là các cách khác nhau để tạo một đối tượng StringBuilder.

// Initialize a new instance of StringBuilder
var sb1 = new StringBuilder();

// Initialize a new instance of StringBuilder using the given capacity
var sb2 = new StringBuilder(capacity: 10);

// Initialize a new instance of StringBuilder with the given string
var sb3 = new StringBuilder(value: "Hello World");

// Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to
var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10);

// Initialize a new instance of StringBuilder with the given string and capacity
var sb5 = new StringBuilder(value: "Hello", capacity: 20);

// Initialize a new instance of StringBuilder from the given substring and capacity
var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);

Lớp StringBuilder có thuộc tính Độ dài cho biết số ký tự mà đối tượng hiện có. Khi thêm nhiều ký tự hơn vào đối tượng, độ dài của đối tượng sẽ tăng cho đến khi đạt đến dung lượng, xác định số ký tự tối đa mà đối tượng hiện có thể chứa.

Nếu số lượng ký tự được thêm vào khiến độ dài vượt quá dung lượng hiện tại của nó, lớp sẽ phân bổ bộ nhớ mới, kết hợp với dung lượng của nó. Sau đó, các ký tự mới được thêm vào đối tượng và thuộc tính Độ dài của nó được điều chỉnh.

StringBuilder tiếp tục thêm động bộ nhớ bổ sung cho đến khi nó đạt đến giá trị của thuộc tính MaxCapacity. Sau đó, không có bộ nhớ nào khác có thể được cấp phát cho đối tượng. Nếu bạn cố gắng thêm nhiều dữ liệu hơn vào đối tượng, nó sẽ ném ra một ArgumentOutOfRangeException hoặc một ngoại lệ OutOfMemoryException.

StringBuilder cung cấp các phương thức sau giúp dễ dàng sửa đổi các chuỗi.

  • Nối - Thêm biểu diễn chuỗi của một đối tượng cụ thể vào trường hợp này.

  • AppendFormat - Thêm chuỗi được trả về bằng cách xử lý một chuỗi định dạng tổng hợp, chứa không hoặc nhiều mục định dạng, vào trường hợp này. Mỗi mục định dạng được thay thế bằng biểu diễn chuỗi của một đối số đối tượng tương ứng.

  • AppendJoin - Nối các biểu diễn chuỗi của các phần tử trong mảng đối tượng được cung cấp, sử dụng dấu phân cách được chỉ định giữa mỗi phần tử, sau đó nối kết quả vào phiên bản hiện tại của trình tạo chuỗi.

  • AppendLine - Thêm dấu chấm dứt dòng mặc định vào cuối đối tượng StringBuilder hiện tại.

  • Rõ ràng - Xóa tất cả các ký tự khỏi phiên bản StringBuilder hiện tại.

  • CopyTo - Sao chép các ký tự vào một chuỗi ký tự hoặc mảng ký tự đích.

  • Công suất đảm bảo - Đảm bảo rằng dung lượng của phiên bản StringBuilder này ít nhất là giá trị được chỉ định.

  • Bằng - Trả về true nếu phiên bản này và phiên bản được cung cấp có các giá trị chuỗi, Dung lượng và MaxCapacity bằng nhau.

  • GetChunks - Trả về một đối tượng có thể được sử dụng để lặp qua các phần ký tự.

  • Chèn - Chèn biểu diễn chuỗi của một đối tượng được chỉ định vào thể hiện này tại một vị trí ký tự được chỉ định.

  • Xóa - Xóa phạm vi ký tự được chỉ định khỏi trường hợp này.

  • Thay thế - Thay thế tất cả các lần xuất hiện của một ký tự hoặc chuỗi được chỉ định trong trường hợp này bằng một ký tự hoặc chuỗi được chỉ định khác.

  • Chuỗi ký tự - Chuyển đổi phiên bản hiện tại thành một chuỗi.

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); // prints aaabbbccc
      Console.WriteLine(newWord); // prints aaadddccc
      var sb = new StringBuilder();
      for (int i = 0; i < 10; i++){
         sb.Append("a");
      }
      Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa

      // Initialize a new instance of StringBuilder
      var sb1 = new StringBuilder();

      // Initialize a new instance of StringBuilder using the given capacity
      var sb2 = new StringBuilder(capacity: 10);
     
      // Initialize a new instance of StringBuilder with the given string
      var sb3 = new StringBuilder(value: "Hello World");
      // Initialize a new instance of StringBuilder with the given capacity and the    maximum capacity it can grow to
      var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50);
      // Initialize a new instance of StringBuilder with the given string and capacity
      var sb5 = new StringBuilder(value: "Hello", capacity: 20);

      // Initialize a new instance of StringBuilder from the given substring and capacity
      var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
   }
}

Đầu ra

aaabbbccc
aaadddccc
aaaaaaaaaa