हैरानी की बात है, यह निर्भर करता है।
यदि आप इसे एक विधि में करते हैं:
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 प्रोड्यूस करता है।
अंत में, जैसा कि इंटर्निंग के संबंध में, स्थिरांक और शाब्दिक को नजरबंद किया गया है, लेकिन जो मूल्य नजरबंद है, वह आईएल में परिणामी निरंतर मूल्य है, न कि शाब्दिक। इसका मतलब यह है कि आप अपनी अपेक्षा से बहुत कम स्ट्रिंग ऑब्जेक्ट प्राप्त कर सकते हैं, क्योंकि कई समान रूप से परिभाषित स्थिरांक या शाब्दिक वास्तव में एक ही वस्तु होंगे! यह निम्नलिखित द्वारा सचित्र है:
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();
}
}