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

String vs StringBuilder ใน C#: ความแตกต่างและเมื่อไหร่ใช้ตัวไหน

ทั้ง 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 ตอนจบ

ตารางเปรียบเทียบ

คุณสมบัติStringStringBuilder
MutabilityImmutableMutable
Memory Allocationทุกครั้งที่แก้ไขขยาย Buffer ตามต้องการ
Performance (Loop/Concat)ช้า (O(n²))เร็ว (O(n))
Thread Safetyปลอดภัยไม่ปลอดภัย
ใช้เมื่อไหร่Concat น้อย, Immutable, Keyใน DictionaryConcat มาก, 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