17

Bản sao có thể xảy ra:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Format vs "string" + "string" hoặc StringBuilder?

ưu tiên thực hiện là gì và nên là điều kiện để thích mỗi trong các cách sau:

String.Format("{0}, {1}", city, state); 

hoặc

city + ", " + state; 

hoặc

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy: Hãy xem http://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh

+0

http: //blogs.msdn này.com/b/ricom/archive/2004/03/12/hiệu suất-quiz-1-of-a-series.aspx – Freelancer

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer

Trả lời

18
  • Trình biên dịch sẽ tối ưu hóa nhiều chuỗi nhất có thể, vì vậy các chuỗi ví dụ chỉ được chia nhỏ cho mục đích ngắt dòng thường có thể được tối ưu hóa thành một chuỗi ký tự.
  • Ghép nối với các biến sẽ được biên dịch thành String.Concat
  • StringBuilder có thể nhanh hơn rất nhiều nếu bạn đang thực hiện một số (hơn 10 hoặc hơn). nó phân bổ nhiều không gian hơn bạn cần trong bộ đệm của nó và thay đổi kích thước bộ đệm bên trong của nó khi cần.

Cá nhân tôi sử dụng String.Format gần như tất cả thời gian vì hai lý do:

  • Đó là dễ dàng hơn nhiều để duy trì chuỗi định dạng hơn sắp xếp lại một loạt các biến.
  • String.Format nhận IFormatProvider được chuyển cho bất kỳ loại IFormattable nào được nhúng trong chuỗi (chẳng hạn như số) để bạn có định dạng số thích hợp cho văn hóa được chỉ định và tổng thể kiểm soát nhiều hơn cách định dạng giá trị.

Ví dụ: vì một số nền văn hóa sử dụng dấu phẩy làm dấu thập phân bạn muốn đảm bảo bằng StringBuilder hoặc String.Format mà bạn chỉ định CultureInfo.InvariantCulture nếu bạn muốn đảm bảo rằng số được định dạng theo cách bạn định .

Hai điều nữa cần lưu ý ...

  • StringBuilder cũng có một chức năng AppendFormat mang đến cho bạn sự linh hoạt của String.Format mà không đòi hỏi một bộ đệm thứ hai không cần thiết.
  • Khi sử dụng StringBuilder, hãy đảm bảo bạn không đánh bại mục đích bằng cách nối các tham số mà bạn chuyển đến Nối. Đó là một điều dễ dàng để bỏ lỡ.
1

Không có diference có liên quan. Nhưng giả sử rằng String.Format bên trong sử dụng một StringBuilder (bạn có thể thấy rằng với công cụ Reflector), việc sử dụng trực tiếp StringBuilder.Append sẽ nhanh hơn.

EDIT: Tất nhiên sử dụng toán tử "+" là tùy chọn tồi tệ nhất vì nó tạo ra một cá thể chuỗi mới cho mỗi chuỗi mà bạn đang ghép nối.

+0

sai, theo liên kết tôi đăng dưới đây nó có vẻ hơn + là cách tốt nhất – Shimmy

+1

@shimmy, Không có StringBuilder trong liên kết đó. Ngoài ra, trong bài kiểm tra đó, bạn chỉ nối 3 Chuỗi, số chuỗi ảnh hưởng đến hiệu suất rất nhiều. –

+0

Bản chỉnh sửa sai. Trình biên dịch C# sẽ lắp ráp các chuỗi hoặc các đối tượng vào một mảng và sau đó gọi String.Concat(). Tôi mong đợi String.Concat (string []) là hiệu quả nhất bởi vì việc triển khai có thể phân bổ chuỗi chính xác đến độ dài chính xác. –