น่าแปลกที่มันขึ้นอยู่กับ
หากคุณทำสิ่งนี้ด้วยวิธีการ:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
จากนั้นคอมไพเลอร์ดูเหมือนจะปล่อยรหัสโดยใช้String.Concat
ตามที่ @Joachim ตอบ (+1 ถึงเขา btw)
หากคุณกำหนดให้เป็นค่าคงที่เช่น:
const String one = "1";
const String two = "2";
const String result = one + two + "34";
หรือเป็นตัวอักษรเหมือนในคำถามเดิม:
String result = "1" + "2" + "3" + "4";
จากนั้นคอมไพเลอร์จะปรับ+
สัญญาณเหล่านั้นให้เหมาะสม เทียบเท่ากับ:
const String result = "1234";
นอกจากนี้คอมไพลเลอร์จะลบนิพจน์ค่าคงที่ภายนอกและจะปล่อยออกมาหากมีการใช้หรือเปิดเผยเท่านั้น ตัวอย่างเช่นโปรแกรมนี้:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
สร้างเพียงสตริงเดียว - ค่าคงที่result
(เท่ากับ "1234") one
และtwo
ไม่ปรากฏใน IL ที่เป็นผลลัพธ์
โปรดทราบว่าอาจมีการเพิ่มประสิทธิภาพเพิ่มเติมในขณะรันไทม์ ฉันแค่ไปตามสิ่งที่ IL ผลิตขึ้น
สุดท้ายเกี่ยวกับภายในค่าคงที่และตัวอักษรจะอยู่ภายใน แต่ค่าที่อยู่ภายในคือค่าคงที่ที่เป็นผลลัพธ์ใน IL ไม่ใช่ค่าตัวอักษร ซึ่งหมายความว่าคุณอาจได้รับวัตถุสตริงน้อยกว่าที่คุณคาดหวังเนื่องจากค่าคงที่หรือตัวอักษรที่กำหนดเหมือนกันหลายตัวจะเป็นวัตถุเดียวกัน! นี่คือภาพประกอบดังต่อไปนี้:
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();
}
}
ในกรณีที่สตริงถูกเชื่อมต่อกันในลูป (หรือแบบไดนามิก) คุณจะได้สตริงพิเศษหนึ่งสตริงต่อการเรียงต่อกัน ตัวอย่างเช่นต่อไปนี้จะสร้างอินสแตนซ์สตริง 12 รายการ: 2 ค่าคงที่ + การวนซ้ำ 10 ครั้งซึ่งแต่ละครั้งจะทำให้เกิดอินสแตนซ์สตริงใหม่:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
แต่ (ก็น่าแปลกใจเช่นกัน) คอมไพเลอร์ต่อเนื่องกันหลายชุดจะถูกรวมเข้าด้วยกันในการเรียงต่อกันแบบหลายสตริงเดียว ตัวอย่างเช่นโปรแกรมนี้ยังสร้างอินสแตนซ์สตริงได้เพียง 12 ชุดเท่านั้น! เนื่องจาก " แม้ว่าคุณจะใช้ตัวดำเนินการ + หลายตัวในคำสั่งเดียวเนื้อหาสตริงจะถูกคัดลอกเพียงครั้งเดียว "
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}