2014-09-02 9 views
5

मैंने हाल ही में सोचा कि string+-ऑपरेटर ओवरलोड करता है। केवल एक ही तरीके जिन्हें मैं देख सकता हूं == and != है। दो तारों को + के साथ संयोजित क्यों किया जा सकता है भले ही उस ऑपरेटर को ओवरलोड नहीं किया गया हो? क्या यह सिर्फ जादू कंपाइलर चाल है या क्या मुझे कुछ याद आ रहा है? यदि पूर्व, स्ट्रिंग क्यों इस तरह से डिजाइन किया गया था?स्ट्रिंग concatenation के लिए स्ट्रिंग अधिभार + ऑपरेटर कहां है?

यह प्रश्न this से उठाया गया था। object से 0 ऑब्जेक्ट्स को दोबारा जोड़ने के लिए + का उपयोग नहीं कर सकता है, इसलिए string ऑपरेटरों को ओवरलोड करने की परवाह नहीं है, तो इस ऑपरेटर को अधिभारित नहीं किया जाता है।

+0

काफी समान: [सी # + ऑपरेटर स्ट्रिंग.कोनकैट फ़ंक्शन कॉल करता है?] (Http://stackoverflow.com/questions/13617707/c-sharp-operator-calls-string-concat-function) –

+1

@ सोनर गॉनुल: हाँ, अब मुझे कुछ प्रश्न भी मिल गए हैं जैसे [यह] (http://stackoverflow.com/questions/10341188/string-concatenation-using-operator)। मैंने यह भी सोचा कि मैंने इस सवाल से पहले एक डुप्लिकेट क्यों पाया है। –

+2

क्यों चिंता करते हैं: ध्यान रखें कि सीएलआर कई भाषाओं का समर्थन करता है। कुछ मनमानी वस्तुओं के साथ स्ट्रिंग concatenation के लिए '+' का उपयोग करने के लिए C# के संदिग्ध निर्णय का पालन नहीं करना चाहेंगे। – CodesInChaos

उत्तर

8

स्ट्रिंग + ऑपरेटर अधिभारित नहीं करता है। यह सी # कंपाइलर है जो कॉल को + ऑपरेटर को String.Concat विधि में परिवर्तित करता है।

पर विचार करें निम्नलिखित कोड:

void Main() 
{ 
    string s1 = ""; 
    string s2 = ""; 

    bool b1 = s1 == s2; 
    string s3 = s1 + s2; 
} 

आईएल

IL_0001: ldstr  "" 
IL_0006: stloc.0  // s1 
IL_0007: ldstr  "" 
IL_000C: stloc.1  // s2 
IL_000D: ldloc.0  // s1 
IL_000E: ldloc.1  // s2 
IL_000F: call  System.String.op_Equality //Call to operator 
IL_0014: stloc.2  // b1 
IL_0015: ldloc.0  // s1 
IL_0016: ldloc.1  // s2 
IL_0017: call  System.String.Concat // No operator call, Directly calls Concat 
IL_001C: stloc.3  // s3 

का उत्पादन हालांकि यह String.Concat करने के लिए कॉल के बारे में नहीं बात करती करता युक्ति यह पता यहाँ 7.7.4 Addition operator कहता है,। हम मान सकते हैं कि यह कार्यान्वयन विस्तार है।

+1

क्या हमारे पास एक निश्चित संदर्भ हो सकता है जो इस मामले को साबित करता है? – spender

+0

@ स्पेंडर भालू मेरे साथ :) इस पर काम कर रहे हैं –

+0

धन्यवाद। क्या यह कहीं भी दस्तावेज है? जॉन ने इस कार्यान्वयन के कारण [इस उत्तर] में भी उल्लेख किया है (http://stackoverflow.com/questions/10341188/string-concatenation-using-operator)। –

1

यह बोली C# 5.0 Specification 7.8.4 Addition operator

स्ट्रिंग संयोजन से है:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 

द्विआधारी + ऑपरेटर के इन भार के प्रदर्शन स्ट्रिंग संयोजन। यदि स्ट्रिंग कॉन्सटेनेशन का एक ऑपरेंड शून्य है, तो खाली स्ट्रिंग प्रतिस्थापित है। अन्यथा, किसी भी गैर-स्ट्रिंग तर्क को को वर्चुअल ToString विधि टाइप ऑब्जेक्ट से विरासत में डालकर अपने स्ट्रिंग प्रस्तुति में परिवर्तित किया गया है। यदि ToString शून्य लौटाता है, तो खाली स्ट्रिंग प्रतिस्थापित है।

मैं क्यों है, हालांकि के बारे में अधिक भार का उल्लेख .. जब से हम किसी भी ऑपरेटर भार के नहीं दिख रहा है यकीन नहीं है।

+2

ये सी # स्तर पर अधिभारित हैं, बस सीएलआर स्तर पर नहीं। – CodesInChaos

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