Đáng ngạc nhiên, nó phụ thuộc.
Nếu bạn làm điều này trong một phương pháp:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
sau đó trình biên dịch dường như phát ra mã bằng cách sử dụng String.Concat
như @Joachim đã trả lời (+1 cho anh ta btw).
Nếu bạn định nghĩa chúng là hằng số , vd:
const String one = "1";
const String two = "2";
const String result = one + two + "34";
hoặc theo nghĩa đen , như trong câu hỏi ban đầu:
String result = "1" + "2" + "3" + "4";
sau đó trình biên dịch sẽ tối ưu hóa đi những +
dấu hiệu đó. Nó tương đương với:
const String result = "1234";
Hơn nữa, trình biên dịch sẽ loại bỏ các biểu thức hằng không liên quan và chỉ phát ra chúng nếu chúng được sử dụng hoặc tiếp xúc. Ví dụ, chương trình này:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
Chỉ tạo một chuỗi - hằng số result
(bằng "1234"). one
và two
không hiển thị trong IL kết quả.
Hãy nhớ rằng có thể có tối ưu hóa hơn nữa trong thời gian chạy. Tôi chỉ đi theo những gì IL được sản xuất.
Cuối cùng, liên quan đến thực tập, hằng số và nghĩa đen được thực tập, nhưng giá trị được thực hiện là giá trị không đổi kết quả trong IL, không phải bằng chữ. Điều này có nghĩa là bạn có thể nhận được thậm chí ít đối tượng chuỗi hơn bạn mong đợi, vì nhiều hằng số hoặc nghĩa đen được xác định giống hệt nhau sẽ thực sự là cùng một đối tượng! Điều này được minh họa bằng cách sau:
public class Program
{
private const String one = "1";
private const String two = "2";
private const String RESULT = one + two + "34";
static String MakeIt()
{
return "1" + "2" + "3" + "4";
}
static void Main(string[] args)
{
string result = "1" + "2" + "34";
// Prints "True"
Console.Out.WriteLine(Object.ReferenceEquals(result, MakeIt()));
// Prints "True" also
Console.Out.WriteLine(Object.ReferenceEquals(result, RESULT));
Console.ReadKey();
}
}
Trong trường hợp các Chuỗi được nối trong một vòng lặp (hoặc nói cách khác là động), bạn kết thúc với một chuỗi bổ sung cho mỗi chuỗi. Chẳng hạn, sau đây tạo ra 12 thể hiện chuỗi: 2 hằng số + 10 lần lặp, mỗi lần lặp lại dẫn đến một thể hiện Chuỗi mới:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Nhưng (cũng đáng ngạc nhiên), nhiều phép nối liên tiếp được trình biên dịch kết hợp thành một phép nối đa chuỗi đơn. Ví dụ, chương trình này cũng chỉ tạo ra 12 trường hợp chuỗi! Điều này là do " Ngay cả khi bạn sử dụng nhiều toán tử + trong một câu lệnh, nội dung chuỗi chỉ được sao chép một lần. "
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}