Tôi lưu ý rằng đây là một bản sao chính xác của
Why is String.Concat not optimized to StringBuilder.Append?
vì vậy đây có lẽ nên được đóng lại.
Nhưng nếu, về mặt lý thuyết, chi phí là nhỏ để thực hiện, lý do nào sẽ ngăn không cho thực hiện?
Có vẻ như bạn đang đề xuất một chút kiến thức: nếu không có lý do gì để không làm X, thì có lý do gì để không làm X không? Số
Tôi thấy ít giá trị khi biết câu trả lời cho các câu hỏi giả định, phản tác dụng. Có lẽ câu hỏi hay hơn để đặt ra sẽ là câu hỏi về thế giới thực:
Có ngôn ngữ lập trình nào sử dụng tối ưu hóa này không?
Có. Trong JScript.NET, chúng tôi phát hiện chuỗi nối trong các vòng lặp và trình biên dịch biến chúng thành các cuộc gọi đến trình tạo chuỗi.
Đó sau đó có thể được theo dõi với:
một số khác biệt giữa JScript .NET và C# mà biện minh cho việc tối ưu hóa trong một ngôn ngữ nhưng không phải trong khác là gì?
Giả định cốt lõi của JScript.NET là các lập trình viên của nó hầu hết là các lập trình viên JavaScript, và nhiều người trong số họ sẽ xây dựng các thư viện phải chạy trong bất kỳ việc thực hiện ECMAScript nào. Những lập trình viên này có thể không biết rõ về .NET framework, và thậm chí nếu họ làm, họ có thể không thể sử dụng StringBuilder mà không làm cho mã thư viện của họ không di chuyển được. Nó cũng hợp lý để giả định rằng các lập trình viên JavaScript có thể là lập trình viên mới làm quen, hoặc lập trình viên đến lập trình thông qua ngành nghề của họ thay vì một khóa học về khoa học máy tính.
Các lập trình viên C# có nhiều khả năng biết rõ hơn về khuôn khổ .NET, để viết các thư viện hoạt động với khung công tác, và là những người lập trình có kinh nghiệm hiểu tại sao ghép chuỗi lặp lại là O (n) . Họ cần tối ưu hóa này được tạo bởi trình biên dịch ít hơn vì họ chỉ có thể tự làm nếu họ cho là cần thiết.
Tóm lại: các tính năng của trình biên dịch là chi tiêu ngân sách của chúng tôi để tăng thêm giá trị cho khách hàng; bạn nhận được nhiều hơn "bang cho buck" thêm tính năng này vào JScript.NET hơn là bạn thêm nó vào C#.
Không có gì ngăn cản bạn thực hiện tối ưu hóa kỹ thuật này, nhưng hãy xem xét hai thao tác không tương đương về mặt ngữ nghĩa. Việc ghép nối một 'string' trả về một đối tượng' string' mới là kết quả của phép toán, trong khi sử dụng 'StringBuilder' sẽ sửa đổi đối tượng chuỗi hiện có. Phân tích mã sẽ phải được thực hiện để đảm bảo rằng bạn không có bất kỳ cách nào dựa vào tác dụng phụ của việc nối. Trong hầu hết các trường hợp, bạn không phải như vậy, đây không phải là vấn đề không thể khắc phục, nhưng sau đó, không khó để viết mã một cách chính xác ngay từ đầu. –
Xem thêm http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx – SLaks
cũng xem bài đăng này: http: //pranayamr.blogspot. com/2011/02/why-to-user-stringbuilder-over-string.html –