2010-06-18 7 views
5

Rất nhiều câu hỏi đã được hỏi về sự khác biệt giữa trình tạo chuỗi và chuỗi và hầu hết mọi người cho rằng trình tạo chuỗi nhanh hơn chuỗi. Tôi tò mò muốn biết nếu xây dựng chuỗi là quá tốt vậy tại sao chuỗi là có? Hơn nữa, một số cơ thể có thể cho tôi một ví dụ mà chuỗi sẽ hữu ích hơn so với xây dựng chuỗi?Chuỗi ở đâu hữu ích hơn StringBuilder?

+2

Xem http://www.yoda.arachsys.com/csharp/stringbuilder.html –

+1

http://www.joelonsoftware.com/articles/fog0000000319.html Phần mềm Joel On có giải thích tốt về những gì thực sự xảy ra khi bạn nối hai chuỗi. Bài viết này là về C++, nhưng C# hoạt động theo cùng một cách. Bỏ qua mọi thứ trong và bên dưới phần "Làm cách nào để khắc phục sự cố này?" phần, vì phần đó là C++ cụ thể; trong C#, bạn sửa chữa nó bằng cách sử dụng 'StringBuilder', hoạt động tương tự như những thứ trong phần" làm cách nào để sửa lỗi này ". – Brian

+0

có thể trùng lặp của [String vs. StringBuilder] (http://stackoverflow.com/questions/73883/string-vs-stringbuilder) – nawfal

Trả lời

3

Nó không phải là một trường hợp trong số đó là hơn hữu ích ...

A StringString - một hoặc nhiều ký tự cạnh nhau. Nếu bạn muốn thay đổi một chuỗi trong cách nọ cách kia, nó sẽ chỉ đơn giản là tạo ra nhiều chuỗi, vì họ là immutable.

A StringBuilder là lớp tạo chuỗi. Nó cung cấp một phương tiện xây dựng chúng mà không tạo ra nhiều chuỗi reduntant trong bộ nhớ. Kết quả cuối cùng sẽ luôn là String.

Đừng làm điều này

string s = "my string"; 
s += " is now a little longer"; 

hay

s = s + " is now longer again"; 

Điều đó sẽ tạo chuỗi trong bộ nhớ (trong thực tế, xem dưới đây).

Làm điều này:

StringBuilder sb = new StringBuilder(); 
sb.Append("my string"); 
sb.Append(" is now a little longer"); 
sb.Append(" is now longer again"); 
string s = sb.ToString(); 

Điều đó sẽ tạo chuỗi trong bộ nhớ (một lần nữa, xem dưới đây).

Bạn có thể làm điều này:

string s = "It is now " + DateTime.Now + "."; 

này chỉ tạo ra chuỗi trong bộ nhớ.

Như một lưu ý phụ, việc tạo StringBuilder sẽ mất một lượng bộ nhớ nhất định.Theo nguyên tắc chung của ngón tay cái:

  • Luôn sử dụng StringBuilder nếu bạn đang ghép chuỗi trong vòng lặp.
  • Sử dụng StringBuilder nếu bạn đang ghép một chuỗi dài hơn 4 lần.
+1

string.Concat cũng là một giải pháp khả thi cho bạn thí dụ. 'string s = string.Concat (" chuỗi của tôi "," bây giờ dài hơn một chút "," bây giờ là còn lại một lần nữa "); ' –

+0

Điểm tốt. Tôi đoán đó là vấn đề về hương vị. –

1

Bạn có thực sự sử dụng trình tạo chuỗi ở đây không?

Console.WriteLine("MyString"); 

StringBuilder là một công cụ tuyệt vời khi bạn cần thực hiện nhiều kết nối để tạo chuỗi.

Jon Skeet có một aricle lớn về vấn đề này ở đây: http://www.yoda.arachsys.com/csharp/stringbuilder.html

Kiểm tra các phần đó bắt đầu "Vì vậy, tôi có nên sử dụng StringBuilder Everywhere, Phải không?"

Ông viết:

Sự khác biệt quan trọng giữa ví dụ này và trước đó là chúng ta có thể dễ dàng trình bày tất cả các chuỗi mà cần phải được nối lại với nhau trong một cuộc gọi đến String.Concat. Điều đó có nghĩa là không có chuỗi trung gian nào cần . StringBuilder là hiệu quả trong ví dụ đầu tiên bởi vì nó đóng vai trò như một container cho kết quả trung gian mà không cần phải sao chép kết quả mà mỗi lần - khi không có kết quả trung gian dù sao, nó không có lợi thế.


+0

thanks brendan..the liên kết thực sự tốt – DJay

2

StringBuilder là tốt hơn khi bạn cần thay đổi giá trị. Nếu không, không cần thiết.

Nếu tôi cần sử dụng cùng một giá trị chuỗi ở 10 vị trí, vì nó là, tôi sẽ sử dụng Chuỗi. Nếu tôi cần thay đổi nó 10 lần, StringBuilder.

7

StringBuilder là một tùy chọn tốt hơn khi xây dựng và sửa đổi chuỗi thông qua lặp hoặc lặp lại nặng.

Thao tác chuỗi đơn giản, chẳng hạn như một vài kết nối hoặc chỉ lưu trữ giá trị chuỗi phù hợp với đối tượng chuỗi chuẩn tốt hơn nhiều.

Câu hỏi tương tự? String vs. StringBuilder

0

StringBuilder không nhanh hơn việc sử dụng chuỗi theo cách chỉ tạo chuỗi.

StringBuilder có thể nhanh hơn khi bạn phải nối nhiều chuỗi lại với nhau (như vòng lặp). Bạn sẽ phải trả tiền phạt hiệu suất khi bạn phải chuyển đổi nội dung của trình tạo chuỗi thành chuỗi.

Một trong những lợi thế thực sự của StringBuilder trên chuỗi là bạn có thể vượt qua nó thông qua một số phương pháp và nối thêm chuỗi trên đường đi. Bạn không thể làm điều đó bằng cách truyền một đối tượng chuỗi. Vì vậy, nếu bạn có một hoạt động đệ quy, nơi bạn đang xây dựng như một đối tượng JSON hoặc một cái gì đó, bạn có thể vượt qua StringBuilder thông qua và nối thêm các giá trị.

11

StringBuilder, như tên được đề xuất, được sử dụng để tạo các chuỗi, trong khi chuỗi là ký tự không thay đổi. Sử dụng các chuỗi khi bạn muốn truyền dữ liệu ký tự, sử dụng StringBuilder khi bạn muốn thao tác dữ liệu ký tự.

0

Chuỗi là tốt vì nó không thay đổi. Và điều bất biến đó là tốt, là thứ mà các ngôn ngữ chức năng đang chứng minh.

Vì nếu bạn có chuỗi (tham chiếu đến) "Đây là chuỗi", bạn có thể chắc chắn rằng chuỗi đó sẽ có cùng giá trị mãi mãi. Mặc dù giá trị của một StringBuilder có thể bị thay đổi (bằng một cuộc gọi phương thức, một chuỗi khác, v.v.).

Tuy nhiên, đôi khi bạn cần tối ưu hóa tốc độ thô và sử dụng bộ nhớ. Trong trường hợp đó, bạn sử dụng một trình xây dựng chuỗi.

Một ví dụ:

var a = "This is a string"; 
var b = a; 
a += ". And some part is added"; // a now references another string in memory 

var aSB = new StringBuilder("This is a string"); 
var bSB = aSB 
aSB.Append(". And some part is added"); // aSB and bSB still reference the same memory spot 

Console.WriteLine(b); // ==> This is a string 
Console.WriteLine(bSB); // ==> This is a string. And some part is added 
0

Phân tích sử dụng được cung cấp tại: Concatenating Strings Efficiently.

Về bản chất, (mặc dù đã đọc liên kết để phân tích đầy đủ), hãy sử dụng StringBuilder khi ghép nối trong một vòng lặp không nhỏ.