2012-04-11 7 views
6

जैसा कि हम सभी जानते हैं कि तारों को तत्काल तत्काल माना जाता है, जिसका अर्थ है कि हमें किसी ऑब्जेक्ट का संदर्भ प्राप्त करने के लिए new का उपयोग करने की आवश्यकता नहीं है। हालांकि ऐसा लगता है कि पहली पंक्ति हैक्या ldstr आंतरिक रूप से newobj लागू करता है?

String first = new String(new char[] {'a'}); 
string second = "a"; 

:

यह हमेशा मेरे विश्वास है कि ढांचा इस की देखभाल कर रही है, और इसलिए मैं समान आईएल मिल अगर मैं कुछ इस तरह किया जाएगा वजह से

newobj instance void [mscorlib]System.String::.ctor(char[]) और दूसरा ldstr "a" का उपयोग करके किया गया।

तो एक स्ट्रिंग संदर्भ प्राप्त करने के लिए, ldstr आंतरिक रूप से newobj पर कॉल करता है और मैं इसे वापस करने के लिए विनिर्देश/विवरण कहां देख सकता हूं?

उत्तर

8

ldstr आपको per the documentation के रूप में शाब्दिक स्ट्रिंग का संदर्भ देता है (याद रखें कि शाब्दिक तार डिफ़ॉल्ट रूप से इंटर्न किए जाते हैं, इसलिए वे केवल एक बार बनाए जाते हैं)। पहला कथन निर्देश का उपयोग करके string का नियमित उदाहरण बनाता है।

+0

धन्यवाद @ ब्रायन, मुझे नहीं पता था कि दस्तावेज़ कहां थे! –

1

string बस, संदर्भ वस्तु प्रकार के लिए था बुनियादी दिशानिर्देश इस प्रकार है कि क्यों new पर आप newobj देखते हैं।

दरअसल अगर आप कुछ इस तरह लिखने की कोशिश है, यह newobj उत्पन्न नहीं करेगा:

int a = new int(); 
a = 2; 
Console.WriteLine(a); 

जिसके परिणामस्वरूप आईएल हो जाएगा

IL_0000: ldc.i4.0  
IL_0001: stloc.0  
IL_0002: ldc.i4.2  
IL_0003: stloc.0  
IL_0004: ldloc.0  
IL_0005: call  System.Console.WriteLine 

अगर आप सिर्फ

int a = 2; 
Console.WriteLine(a); 

बारे में परिणाम आईएल

होगा
IL_0000: ldc.i4.2  
IL_0001: stloc.0  
IL_0002: ldloc.0  
IL_0003: call  System.Console.WriteLine 

आवंटन बिंदु से कोई अंतर नहीं (स्वाभाविक रूप से मिस्ड लाइन है), क्योंकि हम मूल्य प्रकार के बारे में बात कर रहे हैं।

+0

हां। किसने कहा कि यह दिखाता है? मैं दिखाता हूं कि मूल्य प्रकार पर असंगत करना उस निर्देश को इंजेक्ट नहीं करता है। – Tigran

+0

@BrianRasmussen: इसे स्पष्ट करने के लिए संपादित उत्तर। – Tigran

+0

क्षमा करें, मैंने आपके बिंदु को गलत समझा। –

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