2009-11-09 9 views
5

कई साल पहले, जब भी संभव हो, मुझे सलाह दी गई थी कि संसाधनों को रिवर्स ऑर्डर में कैसे आवंटित किया गया था। यह है:सी #: क्या उनके आवंटन के रिवर्स ऑर्डर में संसाधनों का निपटान करने का कोई फायदा है?

block1 = malloc(...); 
block2 = malloc(...); 

... do stuff ... 

free(block2); 
free(block1); 

मैं 640 के एमएस-डॉस मशीन पर कल्पना करता हूं, यह ढेर विखंडन को कम कर सकता है। क्या सी #/एनईटी आवेदन में ऐसा करने का कोई व्यावहारिक लाभ है, या क्या यह ऐसी आदत है जिसने इसकी प्रासंगिकता को पार कर लिया है?

उत्तर

5

यदि आपके संसाधन अच्छी तरह से बनाए गए हैं, तो इससे कोई फर्क नहीं पड़ता (इससे)।

हालांकि, कई खराब निर्मित पुस्तकालय उचित जांच नहीं करते हैं। अपने आवंटन के विपरीत संसाधनों का निपटान आम तौर पर इसका मतलब है कि आप पहले संसाधनों पर निर्भर संसाधन का निपटान कर रहे हैं - जो खराब लिखित पुस्तकालयों को समस्याओं का कारण बनने से रोक सकता है। (आप कभी नहीं एक संसाधन के निपटान, तो एक ही है कि इस मामले में की पहली अस्तित्व पर निर्भर करता है है का उपयोग करें।)

यह भी अच्छा अभ्यास है, क्योंकि अगर आप गलती से एक संसाधन बहुत जल्दी किसी अन्य वस्तु के लिए आवश्यक निपटान के लिए नहीं जा रहे हैं ।

यहां एक उदाहरण है: डेटाबेस ऑपरेशन देखें। आप अपने आदेश को बंद/डिस्पोजे करने से पहले अपने कनेक्शन को बंद/निपटाना नहीं चाहते हैं (जो कनेक्शन का उपयोग करता है)।

+0

अच्छी तरह से बनाया गया कोई अच्छा नहीं है। इसे ऑर्डर-निर्भर होना चाहिए, निर्भर रहना चाहिए और कई परिस्थितियों में जाना जाता है। यह डेटाबेस, लेन-देन, और स्टैक पर चलने वाली किसी भी चीज के सभी कार्यान्वयन में अधिक मायने रखता नहीं है (वहां अधिकांश सॉफ्टवेयर)। ताले एक और उदाहरण हैं और इसका उपयोग कर गैर-बाहरी और गैर-गरीब पुस्तकालयों के ढेर हैं। फ़ाइल सेशन और उनके ताले एक और हैं। घटना एक और रिसाव। किसी भी अप्रबंधित संसाधन पर निर्भर करता है। निर्माण और विनाश हाथ में है, और मुहावरे को संसाधन-शुरूआत के रूप में नहीं लिया जा सकता है- क्या- "अच्छी तरह से निर्माण" है। –

+0

ताकि आरआईआईडब्ल्यूसी ऑक्सीमोरॉन में डब्ल्यूसी को अधिग्रहण के साथ बदल दिया गया हो, जो एक रिलीज बीटीडब्ल्यू का तात्पर्य है। और चूंकि स्मृति और बड़ी संख्या में संसाधनों को अधिकतर सारणित किया जाता है, ओप्स, विचार जाता है ... और सभी प्रकार के हैक आते हैं। संक्षेप में रखें, यह समस्या की प्रकृति है और यह बहुत मायने रखती है। –

+0

और जब मैं ऑर्डर-निर्भरता का बचाव नहीं कर रहा हूं, तो सही अवलोकन यह है कि यह बेहद प्रासंगिक है लेकिन शायद ही कभी वांछनीय है। लेकिन यह कुछ भी है जो वीएम के आधिकारिक विनिर्देशों को चरम सीमा तक सीमित कर दिया गया है। जावा विशेष रूप से और सीएलआर को कम लेकिन अभी भी महत्वपूर्ण हद तक लागू करता है। यह एक हैक है जो काम करने वाले कोड और धारणाओं के बड़े निकायों को तोड़ने के लिए नहीं है, संकलक और जिट बैकएंड डिजाइनरों द्वारा एक दृढ़ निर्णय। ऑर्डर करने में सक्षम कोड-स्वतंत्र प्रसंस्करण खुद को संभावनाओं की एक बड़ी श्रृंखला में उधार देता है लेकिन कई परिदृश्यों के लिए अक्षम हो सकता है। –

4

परेशान मत हो। GarbageCollector को Defragment और ढेर पर वस्तुओं को स्थानांतरित करने का अधिकार सुरक्षित रखता है, तो कोई कह क्या आदेश बातों में हैं।

इसके अलावा, अगर आप बी यह अगर एक बात नहीं करना चाहिए ए और बी और एक संदर्भ के निपटान कर रहे हैं जब आप ए का निपटान करते हैं तो बी का निपटारा करता है, क्योंकि निपटान विधि को अपवाद के बिना एक से अधिक बार कॉल करने योग्य होना चाहिए।

+1

यह सच है, बशर्ते आप एक "निपटाए का उपयोग नहीं करते (यह कम या ज्यादा क्या विल ने कहा, ऊपर है) "दुर्घटना द्वारा संदर्भ (इससे उत्पन्न अन्य वस्तु के माध्यम से), क्योंकि आप मनमाना ord में निपटान करते हैं एर। –

0

नेस्टेड 'यूजिंग्स' आपको दिखाता है कि 'आउटलिव' वास्तव में नहीं है, और शायद ही कभी (40 साल के साक्ष्य के बाद कभी नहीं कहें और कहें) .. और इसमें स्टैक-आधारित वीएम शामिल है जो सीएमओएस पर चलता है ।

[MSDN.com और डफियस द्वारा इसे गायब करने के कुछ प्रयासों के बावजूद, आप जानते हैं कि यह आपके लिए ढेर और ढेर के बीच का अंतर प्रबंधित करता है। अंतरिक्ष में क्या एक स्मार्ट विचार ..

1

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

यदि आप IDISposable को कॉल करने का जिक्र कर रहे हैं। Disispose(), तो यह IDISposable इंटरफ़ेस को लागू करने वाली वस्तुओं के व्यवहार पर निर्भर करता है।

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

ज्यादातर मामलों में, निपटान() सीधे नहीं बुलाया जाता है के साथ कुछ काम करने के लिए नहीं है, लेकिन बल्कि यह एक का उपयोग कर या foreach बयान है, जो मामले में रिवर्स क्रम पैटर्न स्वाभाविक रूप से उभरेगा के हिस्से के रूप परोक्ष कहा जाता है, बयान एम्बेडिंग के अनुसार।

using(Foo foo = new Foo()) 
using(FooDoodler fooDoodler = new FooDoodler(foo)) 
{ 
    // do stuff 
    // ... 
    // fooDoodler automatically gets disposed before foo at the end of the using statement. 
} 
0

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

http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

तो आप जितने चाहें जितना अपने LIFO निपटाने अर्थ विज्ञान के बारे में चिंता कर सकते हैं, लेकिन अगर आप लीक एक, निपटान() के किसी भी क्रम CLR पसंद में कहा जा जा रहे हैं।

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