2010-07-19 8 views
8

मैंने किसी अन्य डेवलपर द्वारा लिखे गए कुछ कोड को देखा जो इस तरह कुछ दिखता है:सरल वर्ग तात्कालिकता कभी सी # में विफल हो जाएगी?

var stringBuilder = new StringBuilder(); 

if(stringBuilder == null) 
{ 
    // Log memory allocation error 
    // ... 
    return; 
} 

(यह कोड में जगह पर है)

प्रश्न 1: क्या त्रुटि लॉगिंग कोड भी कॉल किया जाएगा? अगर कोई स्मृति नहीं थी, तो उस पहली पंक्ति पर System.OutOfMemoryException फेंक नहीं दिया जाएगा?

प्रश्न 2: क्या किसी कन्स्ट्रक्टर को कॉल कभी वापस शून्य हो सकता है?

+2

तकनीकी तौर पर के रूप में मार्क Gravell ने कहा है यह, प्रॉक्सी वर्गों और nullables के लिए संभव है, लेकिन यह इस तरह के एक रोग मामला है कि यह विचार के लायक नहीं है: http://stackoverflow.com/questions/194484/whats-the- अजीब-कोने-केस-यूवे-देखा-इन-सी-या-नेट –

उत्तर

16

आप सही हैं, और वह कोड गलत है। यह विफलता पर OutOfMemoryException फेंक देगा। यह the documentation में स्पष्ट है:

"नए ऑपरेटर स्मृति को आबंटित करने में विफल रहता है, तो यह अपवाद OutOfMemoryException फेंकता है।"

रचनाकार कुछ भी वापस नहीं करते हैं, अकेले नल दें। वे किसी ऑब्जेक्ट में हेरफेर करते हैं जिसे आवंटित किया जा चुका है।

2

मेरी धारणा यह है कि कोडर सी ++ में काम करता था, और यह नहीं जानता कि चीजें सी # में कैसे काम करती हैं।

+4

कोड सी ++ के लिए समान रूप से गलत है। आवंटन विफल होने पर C++ 'new' 'bad_alloc' फेंकता है, जब तक कि आप इसे स्पष्ट रूप से नहीं बताते। –

+0

यह वास्तव में इंटर्न में से एक ने कहा है। मैंने खुद को बहुत सी समय में नहीं देखा है, और लंबे समय तक नहीं। धन्यवाद। –

+0

@ मैथ्यू: हाँ - यदि आप मानक सी ++ का उपयोग कर रहे हैं (और जानें कि आप क्या कर रहे हैं)। प्री-स्टैंडर्ड सी ++ शून्य वापस आ गया, और स्पष्ट रूप से लेखक अपने कौशल को चालू नहीं रख रहा है। –

1
  1. नहीं। किसी ऑब्जेक्ट आवंटित करने के लिए पर्याप्त स्मृति उपलब्ध नहीं होने पर एक आउटऑफमेमरी अपवाद फेंक दिया जाएगा।
  2. नहीं
2

अब, यह कोड एक अलग कहानी है:

StringBuilder stringBuilder = null; 

try { stringBuilder = new StringBuilder(); } catch(Exception) {} 

if(stringBuilder == null) 
{ 
    // Log memory allocation error 
    // ... 
    return; 
} 

उस मामले में, स्ट्रिंग बिल्डर (क़यास) अशक्त हो सकता है।

+1

असल में, स्ट्रिंगबिल्डर 'शून्य' नहीं होगा, यह अनियंत्रित होगा। – Toby

+2

दरअसल, यह संकलित भी नहीं होगा। लेकिन मुझे लगता है कि हम सभी ब्रायन को 'स्ट्रिंगबिल्डर स्ट्रिंगबिल्डर = शून्य' लिखने के लिए मान सकते हैं :) –

+2

क्षमा करें दोस्तों। उदाहरण में कोड फिक्स्ड। एक कंपाइलर की जरूरत कौन है? मुझे सिर्फ एक ऐसी सेवा लिखनी चाहिए जो मेरा कोड एसओ को मूल्यांकन के लिए भेज दे :) –

0

यहां कोड का एक बेहतर संस्करण है। यद्यपि संदर्भ आवंटित करने के लिए पर्याप्त स्मृति नहीं है, तो आपको बहुत बड़ी समस्याएं होंगी।

StringBuilder stringBuilder = null; 

try { 
    stringBuilder = new StringBuilder(); 
} 
catch(OutOfMemoryException) { 
    // log memory error 
} 
संबंधित मुद्दे