Có sự khác biệt về hiệu suất đáng chú ý giữa việc sử dụng nội suy chuỗi không:
myString += $"{x:x2}";
so với String.Format ()?
myString += String.Format("{0:x2}", x);
Tôi chỉ hỏi vì Resharper đang nhắc bản sửa lỗi và tôi đã bị lừa trước đây.
Có sự khác biệt về hiệu suất đáng chú ý giữa việc sử dụng nội suy chuỗi không:
myString += $"{x:x2}";
so với String.Format ()?
myString += String.Format("{0:x2}", x);
Tôi chỉ hỏi vì Resharper đang nhắc bản sửa lỗi và tôi đã bị lừa trước đây.
Câu trả lời:
Đáng chú ý là tương đối. Tuy nhiên: nội suy chuỗi được chuyển thành string.Format()
lúc biên dịch nên chúng sẽ có cùng kết quả.
Tuy nhiên, có sự khác biệt nhỏ: như chúng ta có thể biết từ câu hỏi này , việc nối chuỗi trong trình định dạng sẽ dẫn đến một string.Concat()
lệnh gọi bổ sung .
int
được sử dụng). var a = "hello"; var b = $"{a} world";
biên dịch để nối chuỗi. var a = "hello"; var b = $"{a} world {1}";
biên dịch sang định dạng chuỗi.
nội suy chuỗi được chuyển thành string.Format () tại thời gian biên dịch.
Cũng trong string.Format, bạn có thể chỉ định một số đầu ra cho một đối số và các định dạng đầu ra khác nhau cho một đối số. Nhưng tôi đoán là nội suy chuỗi dễ đọc hơn. Vì vậy, nó tùy thuộc vào bạn.
a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);
b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";
Có một số kết quả kiểm tra hiệu suất https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
String::Format
. và đôi khi thành String::Concat
. Và kiểm tra hiệu suất trên trang đó không thực sự có ý nghĩa: số lượng đối số bạn chuyển cho mỗi phương thức đó là phụ thuộc. concat không phải lúc nào cũng nhanh nhất, stringbuilder không phải lúc nào cũng chậm nhất.
Câu hỏi là về hiệu suất, tuy nhiên tiêu đề chỉ nói "vs", vì vậy tôi cảm thấy phải thêm một vài điểm nữa, một số trong số đó là ý kiến.
Bản địa hóa
string.Format
. Tuy nhiên, có công cụ cho điều đó (ví dụ ReSharper
).Khả năng bảo trì (ý kiến của tôi)
string.Format
dễ đọc hơn nhiều, vì nó tập trung vào câu mà tôi muốn diễn đạt, chẳng hạn như khi xây dựng một thông báo lỗi hay và có ý nghĩa. Việc sử dụng các {N}
trình giữ chỗ giúp tôi linh hoạt hơn và dễ dàng sửa đổi nó hơn sau này.string.Format
ít bị điều này hơn nhiều.Vì vậy, dựa trên những điều này, tôi quyết định gắn bó với string.Format
hầu hết các mã của mình. Tuy nhiên, tôi đã chuẩn bị một phương pháp mở rộng để có cách viết mã trôi chảy hơn mà tôi thích hơn nhiều. Triển khai của tiện ích mở rộng là một lớp lót và nó trông đơn giản như thế này khi được sử dụng.
var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);
Nội suy là một tính năng tuyệt vời, đừng hiểu sai ý tôi. Nhưng IMO thì nó lại tỏa sáng tốt nhất trong những ngôn ngữ không string.Format
có tính năng giống, ví dụ như JavaScript.
{3}
là X hay Y, đặc biệt nếu bạn bắt đầu sắp xếp lại định dạng của mình. Ví dụ về Madlibs: $"It was a {adjective} day in {month} when I {didSomething}"
vs string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
-> $"I {didSomething} on a {adjective} {month} day"
vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
tôi nghĩ rằng bạn ít bị vấn đề này hơn nhiều. Nhưng dù sao, đây là lý do tại sao tôi nhấn mạnh rằng đó là ý kiến của tôi :)