2008-11-13 18 views
40

उदाहरण के लिए, संकलकक्या सी # स्ट्रिंग अक्षर के संगतता को अनुकूलित करता है?

string s = "test " + "this " + "function"; 

को
string s = "test this function"; 

का अनुवाद है और इस तरह स्ट्रिंग संयोजन के साथ प्रदर्शन हिट से बचने के लिए पता है?

उत्तर

44

हां। यह सी # विनिर्देशन द्वारा गारंटीकृत है। यह खंड 7.18 (सी # 3.0 कल्पना की) में बताया गया है:

जब भी एक अभिव्यक्ति ऊपर सूचीबद्ध आवश्यकताओं को पूरा, अभिव्यक्ति संकलन समय पर मूल्यांकन किया जाता है। यह सच है भले ही अभिव्यक्ति बड़ी अभिव्यक्ति की उप-अभिव्यक्ति है जिसमें गैर-निरंतर संरचनाएं हैं।

("उपर्युक्त आवश्यकताएं" शामिल + ऑपरेटर दो लगातार भाव के लिए आवेदन किया।)

भी this question देखें।

+0

वीबी.नेट के साथ ही मुझे लगता है, है ना? – Larsenal

+0

सुनिश्चित नहीं है - यह एक भाषा मुद्दा है, एक ढांचा नहीं है। –

+0

अगर मैं प्रश्न बदलता हूं तो सी #? – Larsenal

2

मुझे विश्वास है कि करने के लिए जवाब है हां, लेकिन आप क्या संकलक बाहर थूक ... बस संकलन को देखने के लिए होगा, और उस पर परावर्तक का उपयोग :-)

7

हां।

सी # न केवल स्ट्रिंग अक्षर के संगतता को अनुकूलित करता है, यह स्थिरांक स्ट्रिंग अक्षर को स्थिरांक में भी ढहता है और उसी संदर्भ के सभी संदर्भों को संदर्भित करने के लिए पॉइंटर्स का उपयोग करता है।

+0

क्या आपके पास इस जानकारी का संदर्भ है? –

+1

इसे "स्ट्रिंग इंटर्निंग" कहा जाता है, और सी # सी के माध्यम से सीएलआर बुक में गहराई से ढका हुआ है। – FlySwat

4

घोड़ों मुँह से:

कड़ी एक और स्ट्रिंग के अंत करने के लिए एक स्ट्रिंग जोड़कर की प्रक्रिया है। जब आप + ऑपरेटर का उपयोग कर स्ट्रिंग अक्षर या स्ट्रिंग स्थिरांक को संयोजित करते हैं, तो कंपाइलर एक स्ट्रिंग बनाता है। कोई रन टाइम कॉन्सटेनेशन नहीं होता है। हालांकि, स्ट्रिंग चर केवल रन टाइम पर संयोजित किया जा सकता है। इस मामले में, आपको विभिन्न दृष्टिकोणों के प्रदर्शन के प्रभाव को समझना चाहिए।

http://msdn.microsoft.com/en-us/library/ms228504.aspx

20

संबंधित विषय पर सिर्फ एक पक्ष टिप्पणी - सी # संकलक भी 'अनुकूलन' होगा कई एक बहु पैरामीटर अधिभार के लिए एक कॉल करने के लिए '+' ऑपरेटर का उपयोग गैर शाब्दिक शामिल concatenations String.Concat() विधि का।

तो

string result = x + y + z; 

string result = String.Concat(x, y, z); 
बल्कि अधिक अनुभवहीन संभावना से

के लिए कुछ करने के लिए बराबर संकलित:

string result = String.Concat(String.Concat(x, y), z); 

कुछ भी नहीं पृथ्वी-टूट, लेकिन सिर्फ इस बिट जोड़ना चाहते थे स्ट्रिंग शाब्दिक concatenation अनुकूलन के बारे में चर्चा के लिए। मुझे नहीं पता कि यह व्यवहार भाषा मानक द्वारा अनिवार्य है या नहीं।

2

मेरे पास एक समान प्रश्न था, लेकिन सी # के बजाय वीबी.नेट के बारे में। इसे सत्यापित करने का सबसे आसान तरीका प्रतिबिंबक के तहत संकलित असेंबली को देखना था।

उत्तर यह था कि सी # और वीबी.नेट कंपाइलर दोनों स्ट्रिंग अक्षरों के संयोजन को अनुकूलित करते हैं।

5

हां - आप इसे स्पष्ट रूप से ILDASM का उपयोग करके देख सकते हैं।

उदाहरण:

नोट:: मैं बस कैसे संकलक व्यवहार करता है देखने के लिए String.Concat() फ़ंक्शन का उपयोग कर रहा

यहाँ एक प्रोग्राम है जो आपके उदाहरण संकलित सीआईएल कोड के बाद के समान है है concatenation के दो अलग-अलग तरीकों।

कार्यक्रम

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "test " + "this " + "function"; 
     string ss = String.Concat("test", "this", "function"); 
    } 
} 

ILDASM

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  29 (0x1d) 
    .maxstack 3 
    .locals init (string V_0, 
      string V_1) 
    IL_0000: nop 
    IL_0001: ldstr  "test this function" 
    IL_0006: stloc.0 
    IL_0007: ldstr  "test" 
    IL_000c: ldstr  "this" 
    IL_0011: ldstr  "function" 
    IL_0016: call  string [mscorlib]System.String::Concat(string, 
                   string, 
                   string) 
    IL_001b: stloc.1 
    IL_001c: ret 
} // end of method Program::Main 

सूचना के रूप में कैसे संकलक String.Concat (व्यवहार करता है करने का विरोध कैसे IL_0001 पर संकलक निरंतर "परीक्षण इस समारोह" बनाया) फ़ंक्शन - जो प्रत्येक कॉनकैट() पैराम्स के लिए निरंतर बनाता है, फिर कॉनकैट() फ़ंक्शन को कॉल करता है।

संबंधित मुद्दे