Şaşırtıcı bir şekilde duruma göre değişir.
Bunu bir yöntemle yaparsanız:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
daha sonra derleyici kodu String.Concat
@ Joachim yanıtını kullanarak (ona btw +1) gönderiyor gibi görünüyor .
Bunları sabitler olarak tanımlarsanız , örneğin:
const String one = "1";
const String two = "2";
const String result = one + two + "34";
veya orijinal soruda olduğu gibi değişmez değerler olarak:
String result = "1" + "2" + "3" + "4";
daha sonra derleyici bu +
işaretleri ortadan kaldıracaktır . Eşdeğeri:
const String result = "1234";
Ayrıca, derleyici yabancı sabit ifadeleri kaldıracak ve yalnızca kullanıldıklarında veya açığa çıktıklarında yayınlayacaktır. Örneğin, bu program:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
Yalnızca bir dize üretir - sabit result
("1234" e eşit). one
ve two
ortaya çıkan IL'de görünmez.
Çalışma zamanında daha fazla optimizasyon olabileceğini unutmayın. Ben sadece IL'nin ürettiği şeyle gidiyorum.
Son olarak, interning ile ilgili olarak, sabitler ve değişmezler dahil edilir, ancak dahili olan değer, IL'deki sonuçta elde edilen sabit değerdir, değişmez değer değil. Bu, beklediğinizden daha az dizi nesnesi elde edebileceğiniz anlamına gelir, çünkü birden fazla aynı tanımlı sabit veya değişmez değer aslında aynı nesne olacaktır! Bu, aşağıdaki şekilde gösterilmektedir:
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();
}
}
Dizelerin bir döngüde (veya başka bir şekilde dinamik olarak) birleştirilmesi durumunda, bitiştirme başına fazladan bir dize elde edersiniz. Örneğin, aşağıdakiler 12 dize örneği oluşturur: 2 sabit + 10 yineleme, her biri yeni bir String örneğiyle sonuçlanır:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Ancak (şaşırtıcı bir şekilde), birden çok ardışık birleştirme, derleyici tarafından tek bir çok dizeli birleştirme halinde birleştirilir. Örneğin, bu program aynı zamanda yalnızca 12 dizgi örneği üretir! Bunun nedeni, " Bir ifadede birden fazla + operatörü kullansanız bile, dize içeriği yalnızca bir kez kopyalanır. "
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}