आश्चर्य की बात है, यह निर्भर करता है।
आप एक विधि में ऐसा करते हैं तो:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
तो संकलक के रूप में @Joachim (उसे करने के लिए +1 Btw) जवाब String.Concat
का उपयोग कर कोड का उत्सर्जन हो रहा है।
हैं तो आप उन्हें के रूप में परिभाषित, जैसे स्थिरांक:
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);
}
केवल उत्पन्न करता है एक string- ("1234" के बराबर) निरंतर result
। one
और two
परिणामस्वरूप आईएल में दिखाई नहीं देते हैं।
ध्यान रखें कि रनटाइम पर और अधिक अनुकूलन हो सकते हैं। मैं सिर्फ आईएल द्वारा उत्पादित किया जा रहा हूँ।
अंत में, इंटर्निंग के संबंध में, स्थिरांक और शाब्दिकों को प्रशिक्षित किया जाता है, लेकिन मूल्य जो इंटर्न किया जाता है वह आईएल में परिणामी स्थिर मूल्य है, शाब्दिक नहीं। इसका मतलब यह है कि आप अपेक्षाकृत कम स्ट्रिंग ऑब्जेक्ट्स प्राप्त कर सकते हैं, क्योंकि कई समान रूप से परिभाषित स्थिरांक या अक्षर वास्तव में एक ही वस्तु होंगे! इस का पालन करते हुए दर्शाया गया है:
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();
}
}
मामले में जहां तार एक पाश में concatenated रहे हैं (या अन्य प्रकार गतिशील), तो आप संयोजन प्रति एक अतिरिक्त तार के साथ खत्म।2 स्थिरांक + 10 पुनरावृत्तियों प्रत्येक एक नया स्ट्रिंग उदाहरण है, जिसके परिणामस्वरूप: उदाहरण के लिए, निम्नलिखित 12 स्ट्रिंग उदाहरणों बनाता
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
लेकिन (यह भी आश्चर्यजनक रूप से), कई लगातार concatenations एक भी बहु में संकलक द्वारा संयोजित किया जाता है स्ट्रिंग concatenation। उदाहरण के लिए, यह प्रोग्राम केवल 12 स्ट्रिंग उदाहरण उत्पन्न करता है! ऐसा इसलिए है क्योंकि "Even if you use several + operators in one statement, the string content is copied only once."
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}
स्ट्रिंग्स केवल प्रशिक्षु कर रहे हैं जब आप स्पष्ट रूप String.Intern फोन देखें। –
@ जोहेइट: क्या वे हैं? –
काफी नहीं। सभी स्ट्रिंग अक्षर स्वचालित रूप से प्रशिक्षित होते हैं। स्ट्रिंग ऑपरेशंस के परिणाम नहीं हैं। –