2011-01-12 39 views
8

Trong C# có thể nối chuỗi trong cách khác nhau:Khi nào tôi nên sử dụng String.Format hoặc String.Concat thay vì toán tử ghép nối?

Sử dụng toán tử nối:

var newString = "The answer is '" + value + "'."; 

Sử dụng String.Format:

var newString = String.Format("The answer is '{0}'.", value); 

Sử dụng String.Concat:

var newString = String.Concat("The answer is '", value, "'."); 

Ưu điểm/nhược điểm của từng phương pháp này là gì? Khi nào tôi nên thích một người hơn những người khác?

Câu hỏi đặt ra là do cuộc tranh luận giữa các nhà phát triển. Một không bao giờ sử dụng String.Format cho nối - ông cho rằng điều này là để định dạng chuỗi, không cho nối, và đó là luôn luôn không thể đọc được vì các mục trong chuỗi được thể hiện theo thứ tự sai. Các khác thường xuyên sử dụng String.Format cho nối, bởi vì ông nghĩ rằng nó làm cho mã dễ đọc hơn, đặc biệt là nơi có một số bộ báo giá liên quan. Cả hai nhà phát triển này cũng sử dụng toán tử ghép nối và String.Builder.

Trả lời

16

Về tốc độ, hầu như luôn luôn là doesn't matter.

var answer = "Use what makes " + "the code most easy " + "to read"; 
+0

+1 để chống lại việc giảm giá không được bảo tồn. – LukeH

+0

Có, liên kết tốt +1. – StuartLC

+4

Sử dụng nối chuỗi thường sẽ tạo ra nhiều đối tượng nhỏ trong bộ nhớ, điều này có thể ảnh hưởng tiêu cực đến hiệu suất thu gom rác. Rất khó để đo lường hiệu ứng như vậy bằng cách kiểm tra từ liên kết của bạn, nhưng nó có thể là vấn đề hiệu suất rất lớn cho các hệ thống lớn với các yêu cầu hiệu suất cứng. –

2

Cân nhắc hiệu suất thường là nguyên nhân dẫn đến quyết định này. Xem this bài viết của Ayende.

0

Nó không khuyên bạn nên để lưu trữ chuỗi trong mã vì vậy nếu bạn sẽ quyết định để trích xuất dây của bạn từ mã sau đó với String.Format nó sẽ dễ dàng hơn để làm

+1

Tại sao không? Tôi đánh giá cao rằng điều này có thể là một vấn đề nếu bạn dự đoán quốc tế hóa, nhưng đối với nhiều ứng dụng, điều này không bao giờ được xem xét. – Kramii

+0

Không bao giờ nói không bao giờ :) –

3

Tôi thường sử dụng string.Format khi tôi ve chuỗi với nhau hơn 2 hoặc 3 giá trị, vì nó làm cho nó dễ dàng hơn để xem những gì kết quả cuối cùng sẽ như thế nào. Ghép nối các chuỗi chậm, vì bạn cần phải tạo một đối tượng chuỗi mới cho mỗi thao tác.

Nếu bạn cần tham gia nhiều hơn 5 chuỗi, hãy sử dụng StringBuilder vì nó sẽ nhanh hơn nhiều.

+1

Tôi đề xuất String.Concat sử dụng StringBuilder vì vậy tôi nghĩ rằng đối số hiệu suất không thành công ở đây –

+1

Thật vậy. Nếu đối số là về hiệu suất tương đối của 'Concat' và' Format' thì 'Concat' sẽ thắng mọi lúc, trừ khi bạn đang làm điều gì đó điên rồ. – LukeH

3

Tôi thường sử dụng để dễ đọc và có xu hướng sử dụng Định dạng. Hầu hết các mã được viết một lần và đọc nhiều lần, do đó, đảm bảo người đọc có thể nhanh chóng hiểu những gì đang được nêu là quan trọng hơn (với tôi).

3

Thật kỳ lạ, nhưng String.Format sử dụng nội bộ StringBuilder.AppendFormat(). Ví dụ: Mã String.Format trông giống như:

public static string Format(IFormatProvider provider, string format, params object[] args) 
{ 
    if (format == null || args == null) 
    throw new ArgumentNullException((format == null ? "format" : "args")); 

    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8)); 
    builder.AppendFormat(provider, format, args); 
    return builder.ToString(); 
} 

Thông tin thêm về điều này bạn có thể tìm thấy here. Vì vậy, tại sao chúng tôi đã không đề cập ở đây về StringBuilder.AppendFormat()!

Về điểm chính của câu hỏi:

Điều quan trọng là chọn công cụ tốt nhất cho công việc. Ý tôi là gì?Hãy xem xét những lời khôn ngoan tuyệt vời này:

* Concatenate (+) is best at concatenating. 
* StringBuilder is best when you need to building. 
* Format is best at formatting. 
0

Đây là bài viết về cách sử dụng bộ nhớ cho các phương pháp ghép và tối ưu hóa trình biên dịch được sử dụng để tạo IL. Concatenation methods and optimization issue

+1

Bạn có thể liên kết với bài viết, nhưng tốt hơn hết là nên chọn thông tin đã chọn và đăng nó ở đây. Nếu blog đó biến mất/được di chuyển một ngày, điều này sẽ trở thành câu trả lời vô ích. – Mike

Các vấn đề liên quan