Đối với một trường hợp đơn giản, đó là một phép nối đơn đơn giản, tôi cảm thấy rằng nó không có giá trị phức tạp string.Format
(và tôi chưa thử nghiệm, nhưng tôi nghi ngờ rằng đối với trường hợp đơn giản như thế này, string.Format
có thể chậm hơn một chút, với phân tích chuỗi định dạng và tất cả). Giống như Jon Skeet, tôi không muốn gọi rõ ràng .ToString()
, vì điều đó sẽ được thực hiện ngầm bởi string.Concat(string, object)
quá tải và tôi nghĩ rằng mã trông sạch hơn và dễ đọc hơn nếu không có nó.
Nhưng đối với nhiều từ nối (bao nhiêu là chủ quan), tôi chắc chắn thích hơn string.Format
. Tại một thời điểm nhất định, tôi nghĩ rằng cả khả năng đọc và hiệu suất đều bị ảnh hưởng không cần thiết với sự ghép nối.
Nếu có nhiều tham số đối với chuỗi định dạng (một lần nữa, "nhiều" là chủ quan), tôi thường thích bao gồm các chỉ số được nhận xét trên các đối số thay thế, vì tôi không biết giá trị nào chuyển đến tham số nào. Một ví dụ tiếp theo:
Console.WriteLine(
"Dear {0} {1},\n\n" +
"Our records indicate that your {2}, \"{3}\", is due for {4} {5} shots.\n" +
"Please call our office at 1-900-382-5633 to make an appointment.\n\n" +
"Thank you,\n" +
"Eastern Veterinary",
/*0*/client.Title,
/*1*/client.LastName,
/*2*/client.Pet.Animal,
/*3*/client.Pet.Name,
/*4*/client.Pet.Gender == Gender.Male ? "his" : "her",
/*5*/client.Pet.Schedule[0]
);
Cập nhật
Tôi nhận ra rằng ví dụ tôi đã đưa ra hơi khó hiểu, vì có vẻ như tôi đã sử dụng cả phép nối và string.Format
ở đây. Và vâng, về mặt logic và từ vựng, đó là những gì tôi đã làm. Nhưng tất cả các đoạn nối sẽ được tối ưu hóa bởi trình biên dịch 1 , vì chúng đều là chuỗi ký tự. Vì vậy, tại thời điểm chạy, sẽ có một chuỗi duy nhất. Vì vậy, tôi đoán tôi nên nói rằng tôi muốn tránh nhiều kết nối trong thời gian chạy .
Tất nhiên, hầu hết chủ đề này hiện đã lỗi thời, trừ khi bạn vẫn gặp khó khăn khi sử dụng C # 5 trở lên. Bây giờ chúng ta có các chuỗi nội suy , để dễ đọc, vượt trội hơn nhiều so với string.Format
, trong hầu hết các trường hợp. Ngày nay, trừ khi tôi chỉ nối một giá trị trực tiếp vào đầu hoặc cuối của một chuỗi ký tự, tôi hầu như luôn sử dụng phép nội suy chuỗi. Hôm nay, tôi sẽ viết ví dụ trước đó của tôi như thế này:
Console.WriteLine(
$"Dear {client.Title} {client.LastName},\n\n" +
$"Our records indicate that your {client.Pet.Animal}, \"{client.Pet.Name}\", " +
$"is due for {(client.Pet.Gender == Gender.Male ? "his" : "her")} " +
$"{client.Pet.Schedule[0]} shots.\n" +
"Please call our office at 1-900-382-5633 to make an appointment.\n\n" +
"Thank you,\n" +
"Eastern Veterinary"
);
Bạn không mất thời gian biên dịch nối theo cách này. Mỗi chuỗi nội suy được string.Format
trình biên dịch chuyển thành lệnh gọi và kết quả của chúng được nối với nhau tại thời điểm chạy. Điều đó có nghĩa là đây là một sự hy sinh hiệu suất thời gian chạy để có thể đọc được. Hầu hết thời gian, đó là một sự hy sinh đáng giá, vì hình phạt thời gian chạy là không đáng kể. Tuy nhiên, trong mã quan trọng về hiệu suất, bạn có thể cần lập hồ sơ các giải pháp khác nhau.
1
Bạn có thể thấy điều này trong đặc tả C # :
... các cấu trúc sau được cho phép trong các biểu thức không đổi:
...
- Toán tử nhị phân + ... được xác định trước ...
Bạn cũng có thể xác minh nó bằng một đoạn mã nhỏ:
const string s =
"This compiles successfully, " +
"and you can see that it will " +
"all be one string (named `s`) " +
"at run time";