Trong C#, string và StringBuilder là hai lớp thông được dùng để lưu trữ và thao tác với chuỗi, tuy nhiên bạn đã biết đặc điểm khác biệt của hai lớp này chưa? Khi nào sử dụng string và khi nào sử dụng StringBuilder? Sau đây chúng ta sẽ tìm hiểu về sự khác biệt giữa chúng:
String | StringBuilder |
---|---|
Nằm trong namespace System | Nằm trong namespace System.Text |
Một instance của lớp string là immutable (không có khả năng thay đổi). Nghĩa là string Object sau khi tạo sẽ không thay đổi được nó ở trong memory. Nếu thay đổi nó, thì nó sẽ tạo ra một instance mới trong memory. | Một instance của StringBuilder là mutable (có khả năng thay đổi), sau khi tạo chúng ta có thể tạo ra bất cứ thao tác nào thay đổi nó ở trong memory như mở rộng, xóa… mà chỉ tạo duy nhất một instance. |
Bởi vì string là immutable nên nó có thể sử dụng an toàn trên nhiều luồng mà không gây sự cố nào. Thread safe được đảm bảo. | StringBuilder trong C# là thread-safe, có thể bị lỗi dữ liệu khi lập trình đa luồng nếu không lock lại. |
Hiệu suất sẽ không cao khi có thao tác chỉnh sửa hoặc nối chuỗi. | Hiệu quả cao khi chỉnh sửa chuỗi hoặc nỗi nhiều chuỗi lại với nhau. |
Để hiểu thêm, chúng ta sẽ đi đến một đoạn code và trực quan hóa lại cách string và StringBuilder làm việc: string
string testString = "Hello!";
testString = testString + " This";
testString = testString + " is";
testString = testString + " c#";
testString = testString + " tutorial";
Console.WriteLine(testString);
Trong ví dụ trên, ta sửa đổi testString 5 lần, tính cả lần khởi tạo, vì vậy nó sẽ tạo 5 instance của object ở trong memory. Cả 5 instance đều tồn tại cùng lúc nhưng biến testString sẽ chỉ trỏ đến bộ nhớ của cùng của nó, như hình minh họa dưới đây:
StringBuilder
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Hello!");
stringBuilder.Append(" This");
stringBuilder.Append(" is");
stringBuilder.Append(" c#");
stringBuilder.Append(" tutorial");
Console.WriteLine(testString);
Cũng giống ví dụ trên, chúng ta cũng tạo là một biến string và nối nó 5 lần. Nhưng đối với StringBuilder, thay vì khởi tạo bộ nhớ 5 lần và tạo ra 5 instance thì nó chỉ tạo duy nhất 1 instance và mở rộng bộ nhớ ra từ đó, như hình minh họa dưới đây:
Như vậy, chúng ta đã đi qua những điểm khác biệt cơ bản giữa string và StringBuilder. Chúc ae code tốt!
Tham khảo: http://gyanendushekhar.com/2016/05/01/string-and-stringbuilder-csharp/