2011-04-18 13 views
5

मैं जग रीगल के ब्लॉग पर This Article पढ़ रहा था और ऐसा लगता है कि वह जो सुझाव दे रहा था वह वास्तव में एक वस्तु प्रारंभकर्ता का उपयोग करने जैसा नहीं था। तब मुझे एहसास हुआ कि मुझे वास्तव में निश्चित रूप से पता नहीं था।क्या कोई ऑब्जेक्ट बनाया गया है जब कोई प्रारंभकर्ता फेंकता है?

जब कोई ऑब्जेक्ट बनाया गया है, ऑब्जेक्ट प्रारंभकर्ताओं के साथ, और उन intitializers में से एक फेंकता है (शायद एक नल संदर्भ अपवाद) ... क्या वास्तव में वस्तु का निर्माण किया गया है? क्या यह मूल रूप से कन्स्ट्रक्टर में फेंकने वाले अपवाद की तरह है? या वस्तु पूरी तरह से बनाई गई है, और फिर शुरू किया?

उत्तर

3

var x = new Foo { Property1 = 5}; की तरह एक वस्तु initilizer बयान कुछ इस तरह के रूप में लागू किया जाएगा तक सभी सभी गुण सेट किए गए हैं, इसलिए यदि कोई अपवाद फेंक दिया गया है, तो अपवाद पकड़ा गया है, भले ही निर्मित ऑब्जेक्ट खो गया है (चर null या इससे पहले जो भी मान था)।

+0

इसलिए जब अलग, परिणाम के रूप में अगर एक निर्माता thows ही हैं। तो, मेरे विचार है कि जग की पुनरुत्थान वास्तव में एक जैसी नहीं है। –

+0

परिणाम अधिकतर समान हैं। अपवाद के बाद स्मृति में क्या बचा है में एक अंतर हो सकता है। जग सिफारिश कर रहे हैं कि ReSharper सीमा प्रारंभिक सुझाव 10 गुणों के लिए अन्यथा अन्यथा कोड की एक पंक्ति पर बहुत कुछ चल रहा है जब डीबग करना मुश्किल हो सकता है। –

1

ऑब्जेक्ट का निर्माण किया जाएगा, लेकिन प्रारंभिकता पूर्ण नहीं होगी। शुरुआत सिर्फ एक कंपाइलर चाल है; जेनरेट किए गए आईएल को देखें और आप इसे वैसे ही देखेंगे। ब्लॉग पोस्ट शिकायत कर रहा है कि यह कहना मुश्किल है कि अपवाद किस लाइन पर हुआ, लेकिन व्यक्तिगत रूप से मैंने कभी मुश्किल नहीं किया।

Foo temp = new Foo(); 
temp.Property1 = 5; 
x = temp; 

आप देख सकते हैं, initiallizer में गुण सेट कर रहे हैं के बाद वस्तु का निर्माण किया है, फिर भी चर सेट नहीं है:

2

यह पूरी तरह से पहले बनाया गया है, फिर शुरू किया गया। यदि अपवाद फेंक दिया जाता है तो आपको इस तरह के किसी ऑब्जेक्ट का संदर्भ कभी नहीं मिलेगा, संकलक यह सुनिश्चित करता है कि आपका संदर्भ केवल उचित रूप से प्रारंभिक ऑब्जेक्ट का संदर्भ दे सके। यह गारंटी देने के लिए एक अस्थायी का उपयोग करता है।

उदाहरण के लिए, इस कोड:

var obj = new Model { 
    FirstName = reader[0].ToString(), 
    LastName = reader[1].ToString(), 
    Age = Convert.ToInt32(reader[2].ToString()) 
}; 

को संकलक द्वारा फिर से लिखा है:

var temp = new Model(); 
temp.FirstName = reader[0].ToString(); 
temp.LastName = reader[1].ToString(); 
temp.Age = Convert.ToInt32(reader[2].ToString()) 
var obj = temp; 
0

आप सब जानते हैं संकलित आईएल हमेशा एक ही नहीं है करने की आवश्यकता है !!

अंतर डीबग/रिलीज बिल्ड कॉन्फ़िगरेशन में है।

अगर तुम मुझे विश्वास है न परावर्तक में एक नज़र .....