ทั้ง string และ StringBuilder ใช้จัดการข้อความ แต่มีลักษณะการทำงานที่ต่างกันจริงๆ
String (Immutable - ไม่เปลี่ยนแปลงได้)
- ทุกครั้งที่ "แก้ไข" สตริง จะสร้าง Object ใหม่ใน Memory
- เหมาะสำหรับสตริงที่ไม่เปลี่ยนแปลงบ่อย หรือขนาดเล็ก
- Thread-safe โดยธรรมชาติ (เพราะ Immutable)
string s = "Hello";
s += " World"; // สร้าง String ใหม่ ทิ้งตัวเก่า
s = s.Replace("World", "C#"); // สร้างใหม่อีกครั้ง
StringBuilder (Mutable - เปลี่ยนแปลงได้)
- แก้ไขข้อมูลใน Buffer เดียวกัน ไม่สร้าง Object ใหม่ทุกครั้ง
- เหมาะสำหรับการต่อสตริงหลายครั้ง, Loop, ขนาดใหญ่
- ไม่ Thread-safe (ต้อง Lock เองถ้า Multi-thread)
StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" World");
sb.Replace("World", "C#");
string result = sb.ToString(); // แปลงกลับเป็น String ตอนจบ
ตารางเปรียบเทียบ
| คุณสมบัติ | String | StringBuilder |
|---|---|---|
| Mutability | Immutable | Mutable |
| Memory Allocation | ทุกครั้งที่แก้ไข | ขยาย Buffer ตามต้องการ |
| Performance (Loop/Concat) | ช้า (O(n²)) | เร็ว (O(n)) |
| Thread Safety | ปลอดภัย | ไม่ปลอดภัย |
| ใช้เมื่อไหร่ | Concat น้อย, Immutable, Keyใน Dictionary | Concat มาก, Loop, String Building |
Benchmark แนวทาง
// ช้า - String Concat ใน Loop string s = ""; for (int i = 0; i < 10000; i++) s += i; // เร็ว - StringBuilder var sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append(i); string result = sb.ToString();
แนวทางปฏิบัติ
- Concat < 5-10 ครั้ง: ใช้
stringหรือstring.Concat/string.Join - Concat มาก / ใน Loop: ใช้
StringBuilder - กำหนด Capacity เริ่มต้นได้:
new StringBuilder(1000)ลดการ Resize - ใช้
string.Create(C# 9+) สำหรับ Performance Critical