Nối chuỗi sử dụng toán tử '+'


86

Nhìn vào stringsiêu dữ liệu lớp, tôi chỉ thấy các toán tử ==!=quá tải. Vậy làm thế nào nó có thể thực hiện nối cho +toán tử ''?

Chỉnh sửa :

Một số lưu ý thú vị từ Eric Lippert về nối chuỗi:

Phần 1

Phần 2

Ngoài ra còn có một bài viết tuyệt vời của Joel được giới thiệu trong phần 2 ( http://www.joelonsoftware.com/articles/fog0000000319.html )

Câu trả lời:


143

Nó không - trình biên dịch C # không :)

Vì vậy, mã này:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

thực sự được biên dịch thành:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah - chỉnh sửa can thiệp đã vô tình loại bỏ các bit khác.)

Lợi ích của trình biên dịch C # nhận thấy rằng có nhiều chuỗi nối ở đây là bạn không phải tạo một chuỗi trung gian x + ymà sau đó cần được sao chép lại như một phần của quá trình nối của (x + y)z. Thay vào đó, chúng tôi hoàn thành tất cả trong một lần.

CHỈNH SỬA: Lưu ý rằng trình biên dịch không thể làm bất cứ điều gì nếu bạn nối trong một vòng lặp. Ví dụ, mã này:

string x = "";
foreach (string y in strings)
{
    x += y;
}

chỉ kết thúc tương đương với:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

... vì vậy đây không tạo ra rất nhiều rác, và đó là lý do tại sao bạn nên sử dụng một StringBuildertrường hợp như vậy. Tôi có một bài viết đi vào chi tiết hơn về cả hai , hy vọng sẽ trả lời các câu hỏi khác.


8
Câu trả lời tốt; chỉ là một câu hỏi tiếp theo: nếu bạn đang nối các chuỗi bên trong một vòng lặp, trình biên dịch hoạt động như thế nào đối với toán tử .Concat khi nó không thể biết trước điều gì sẽ xảy ra trong vòng lặp.
frenchie

À được! Và đó là lý do tại sao tốt hơn nên sử dụng StringBuilder cho các đoạn nối?
frenchie

4
@frenchie: Đó là lý do tại sao tốt hơn nên sử dụng StringBuilder để nối lặp lại ... nhưng tại sao nó không đáng để ghép một số giá trị cố định .
Jon Skeet

@ Jon-Skeet: cảm ơn vì đã giải thích nhanh ... tôi cũng nên đăng ký IL..và đây cũng là cách int thêm vào? bằng cách gọi phương thức Thêm?
NoviceProgrammer,

2
Nhưng lưu ý rằng ngày nay các phương thức string.Concatstring.Joincó nhiều quá tải, bao gồm cả một số IEnumerable<>trường hợp lấy một ví dụ. Vì vậy, chúng thuận tiện hơn để sử dụng trong hầu hết các trường hợp hơn là sử dụng a StringBuilder(Tôi không biết liệu các phương pháp này có sử dụng StringBuildernội bộ hay không, tôi chỉ nói rằng chúng thuận tiện hơn trong hầu hết các trường hợp).
Jeppe Stig Nielsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.