ToString
sử dụng
Không, bạn không nên sử dụng ToString
ở đây.
Nối chuỗi tự động biến đổi các chuỗi không thành chuỗi, có nghĩa là hai biến thể của bạn gần giống nhau:
Khi một hoặc cả hai toán hạng thuộc kiểu chuỗi, các toán tử bổ sung được xác định trước sẽ ghép nối biểu diễn chuỗi của toán hạng.
Nguồn: Đặc tả ngôn ngữ C #: Toán tử bổ sung, MSDN .
Mặt khác, cái đầu tiên (không có ToString
):
- Viết ngắn hơn
- Là ngắn hơn để đọc,
- Dễ bảo trì hơn và:
- cho thấy chính xác ý định của tác giả: nối chuỗi.
Vì vậy, thích cái đầu tiên.
Dưới mui xe
Điều cũng thú vị là để xem những gì xảy ra dưới mui xe. Một trong những cách để xem nó là xem mã IL trong LINQPad. Chương trình này:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
được dịch sang IL sau:
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
Thấy System.String.Concat
chưa Điều đó có nghĩa là mã gốc có thể được viết giống như vậy, nó chuyển thành chính xác IL:
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
Khi bạn đọc tài liệu vềstring.Concat(object[])
, bạn có thể biết rằng:
Phương pháp này concatenates từng đối tượng trong args bằng cách gọi parameterless ToString
phương pháp của đối tượng đó; nó không thêm bất kỳ dấu phân cách nào
Điều này có nghĩa ToString
là dư thừa. Cũng thế:
String.Empty
được sử dụng thay cho bất kỳ đối tượng null nào trong mảng.
Mà xử lý độc đáo trường hợp một số toán hạng là null (xem chú thích 1).
Trong khi trong ví dụ trước, phép nối được dịch thành string.Concat
, người ta cũng nên làm nổi bật tối ưu hóa trình biên dịch:
var a = "Hello " + "World";
được dịch thành:
ldstr "Hello World"
stloc.0
Mặt khác:
var a = string.Concat("Hello ", "World");
được dịch thành:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
Các lựa chọn thay thế khác
Tất nhiên có nhiều cách khác để nối các biểu diễn chuỗi của các đối tượng trong C #.
StringBuilder
được sử dụng khi bạn cần thực hiện nhiều thao tác nối và giúp giảm số lượng chuỗi trung gian được tạo. Quyết định xem bạn nên sử dụng một StringBuilder
hoặc một cách ghép thông thường có thể không dễ dàng. Sử dụng một hồ sơ hoặc tìm kiếm các câu trả lời có liên quan trên Stack Overflow.
Việc sử dụng StringBuilder
có một nhược điểm lớn là làm cho mã khó đọc và bảo trì. Đối với các trường hợp đơn giản như câu hỏi trong câu hỏi của bạn, StringBuilder
không chỉ có hại cho khả năng đọc mã, mà còn vô dụng về mặt hiệu suất.
string.Join
nên được sử dụng khi bạn cần thêm dấu phân cách.
Rõ ràng, không bao giờ sử dụng string.Join
với một dấu phân cách trống để nối chuỗi.
string.Format
có thể được sử dụng khi tạo khuôn mẫu chuỗi được ưu tiên để nối chuỗi. Một trong những trường hợp bạn có thể thích đó là khi tin nhắn có thể được bản địa hóa, như được đề xuất trong câu trả lời của kunthet.
Việc sử dụng string.Format
có một số nhược điểm khiến nó không phù hợp với các trường hợp đơn giản như của bạn:
Với các trình giữ chỗ "{0}" đơn giản, thường không rõ tham số nào đi đâu. Nó thường xuyên bị nhầm lẫn đảo ngược các tham số hoặc quên một tham số. May mắn thay, C # 6 cuối cùng đã giới thiệu phép nội suy chuỗi giải quyết vấn đề này.
Hiệu suất thời gian chạy có thể giảm. Tất nhiên, đừng cho rằng string.Format
là luôn luôn chậm hơn. Nếu hiệu suất có vấn đề, hãy đo hai cách tiếp cận và xác định phương pháp nào nhanh hơn dựa trên kết quả thực tế của bạn thay vì giả định.
Mã này hơi dài để viết, đọc lâu hơn và khó bảo trì hơn, mặc dù điều này cực kỳ nhỏ và không nên làm phiền bạn quá nhiều.
Sự khác biệt xuất hiện khi một trong các đối tượng là null
. Không có ToString
, a null
được thay thế bằng một chuỗi rỗng. Với ToString
, một NullReferenceException
là ném.
a + "" + b + ""
hoặc"" + a + b + ""
, nó không thành vấn đề: đó là tất cả các chuỗi nối. Tronga + b + ""
đó có vấn đề:a
vàb
được thêm vào đầu tiên.