2012-04-26 31 views

Trả lời

124

Nó không - các 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 soạn như:

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

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

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 kết thúc việc tạo chuỗi trung gian là x + y mà sau đó cần phải được sao chép lại như là một phần của việc ghép nối của (x + y)z. Thay vào đó, chúng ta hoàn thành tất cả trong một lần.

EDIT: 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ụ, đoạn mã này:

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

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

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

... do đó, điều nà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 StringBuilder cho những trường hợp như vậy. Tôi có một số article going into more details about the two, hy vọng sẽ trả lời thêm câu hỏi.

+8

Câu trả lời hay; chỉ là một câu hỏi tiếp theo: nếu bạn đang ghép 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 với toán tử .Concat khi nó không thể biết trước những gì sẽ xảy ra trong vòng lặp. – frenchie

+0

@frenchie: Sẽ chỉnh sửa cho điều này. –

+0

Ah ok! Và đó là lý do tại sao tốt hơn nên sử dụng StringBuilder cho các kết nối? – frenchie

Các vấn đề liên quan