Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วัตถุประสงค์ของคลาส StringBuilder ใน C#


ใน C# สตริง (String) เป็น Immutable (ไม่สามารถเปลี่ยนแปลงได้) หมายความว่าหลังสร้างแล้วไม่สามารถแก้ไขได้ การแก้ไขใดๆ จะสร้างสตริงใหม่ที่มีการเปลี่ยนแปลง ทิ้งสตริงเดิมไว้

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

คลาส StringBuilder แทนออบเจกต์คล้ายสตริงที่แก้ไขได้ (Mutable String) ใช้งานต่างจาก string ที่เป็น Immutable การแก้ไขสตริงซ้ำๆ จะสร้าง Copy ทุกครั้ง ส่งผลต่อ Performance ในลูปใหญ่ StringBuilder ให้ทางเลือกที่มีประสิทธิภาพสำหรับการ Append, Remove, Replace, Insert ตัวอักษร

StringBuilder มี Internal Buffer เก็บตัวอักษร หากพื้นที่พอ จะ Append ต่อไป มิฉะนั้นสร้าง Buffer ใหม่ Copy ข้อมูลเก่าไป แล้ว Append ใหม่

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

วิธีสร้าง StringBuilder หลากหลายรูปแบบ:

var sb1 = new StringBuilder();
var sb2 = new StringBuilder(capacity: 10);
var sb3 = new StringBuilder(value: "Hello World");
var sb4 = new StringBuilder(capacity: 20, maxCapacity: 100);
var sb5 = new StringBuilder(value: "Hello", capacity: 20);
var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);

StringBuilder มี Property Length (จำนวนตัวอักษรปัจจุบัน) และ Capacity (สูงสุดที่จุได้ใน Buffer ปัจจุบัน) หากเพิ่มตัวอักษรเกิน Capacity จะจัดสรรหน่วยความจำใหม่ คูณ Capacity เป็นสองเท่า จนถึง MaxCapacity หลังจากนั้นจะโยน Exception

เมธอดหลักของ StringBuilder:

  • Append - เพิ่มข้อมูลท้าย
  • AppendFormat - เพิ่มข้อมูลแบบ Format
  • AppendJoin - รวมอาร์เรย์ด้วย Separator แล้ว Append
  • AppendLine - เพิ่มบรรทัดใหม่
  • Clear - ล้างข้อมูลทั้งหมด
  • CopyTo - คัดลอกไปยัง Char Array/Span
  • EnsureCapacity - รับรอง Capacity
  • Equals - เปรียบเทียบ StringBuilder
  • GetChunks - วนลูป Chunks ของข้อมูล
  • Insert - แทรกที่ตำแหน่งที่กำหนด
  • Remove - ลบช่วงตัวอักษร
  • Replace - แทนที่ตัวอักษร/สตริง
  • ToString - แปลงเป็น String

ตัวอย่างโค้ด

using System;
using System.Text;

class Program
{
    static void Main()
    {
        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

        // ตัวอย่าง Constructor ต่างๆ
        var sb1 = new StringBuilder();
        var sb2 = new StringBuilder(capacity: 10);
        var sb3 = new StringBuilder(value: "Hello World");
        var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50);
        var sb5 = new StringBuilder(value: "Hello", capacity: 20);
        var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
    }
}

ผลลัพธ์

aaabbbccc
aaadddccc
aaaaaaaaaa