Anehnya, itu tergantung.
Jika Anda melakukan ini dengan metode:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
kemudian compiler tampaknya memancarkan kode menggunakan String.Concat
@Joachim menjawab (+1 padanya btw).
Jika Anda mendefinisikannya sebagai konstanta , misalnya:
const String one = "1";
const String two = "2";
const String result = one + two + "34";
atau sebagai literal , seperti pada pertanyaan awal:
String result = "1" + "2" + "3" + "4";
maka kompilator akan mengoptimalkan +
tanda - tanda tersebut. Ini setara dengan:
const String result = "1234";
Selanjutnya, kompilator akan menghapus ekspresi konstanta asing, dan hanya memancarkannya jika digunakan atau diekspos. Misalnya, program ini:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
Hanya menghasilkan satu string- konstanta result
(sama dengan "1234"). one
dan two
tidak muncul di IL yang dihasilkan.
Perlu diingat bahwa mungkin ada pengoptimalan lebih lanjut pada waktu proses. Saya hanya mengikuti apa yang IL diproduksi.
Akhirnya, dalam hal interning, konstanta dan literal diinternir, tetapi nilai yang diinternir adalah nilai konstanta yang dihasilkan di IL, bukan literal. Ini berarti bahwa Anda mungkin mendapatkan lebih sedikit objek string dari yang Anda harapkan, karena beberapa konstanta atau literal yang didefinisikan secara identik sebenarnya akan menjadi objek yang sama! Ini diilustrasikan sebagai berikut:
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();
}
}
Dalam kasus di mana String digabungkan dalam satu lingkaran (atau sebaliknya secara dinamis), Anda berakhir dengan satu string tambahan per penggabungan. Misalnya, berikut ini membuat 12 instance string: 2 konstanta + 10 iterasi, masing-masing menghasilkan instance String baru:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Tetapi (juga secara mengejutkan), beberapa penggabungan yang berurutan digabungkan oleh kompilator menjadi satu penggabungan multi-string. Misalnya, program ini juga hanya menghasilkan 12 instance string! Ini karena " Meskipun Anda menggunakan beberapa + operator dalam satu pernyataan, konten string hanya akan disalin sekali. "
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}