प्रश्न: Java / C # RAII क्यों लागू नहीं कर सकता है?
स्पष्टीकरण: मुझे पता है कि कचरा संग्राहक निर्धारक नहीं है। तो वर्तमान भाषा सुविधाओं के साथ यह किसी वस्तु के निपटान () विधि के लिए गुंजाइश से बाहर निकलने पर स्वचालित रूप से बुलाया जाना संभव नहीं है। लेकिन क्या ऐसी नियतवादी सुविधा जोड़ी जा सकती है?
मेरी समझ:
मुझे लगता है कि RAII का कार्यान्वयन दो आवश्यकताओं को पूरा करना चाहिए:
1. एक संसाधन का जीवनकाल एक दायरे के लिए बाध्य होना चाहिए।
2. लागू। संसाधन का मुक्तकरण प्रोग्रामर द्वारा स्पष्ट विवरण के बिना होना चाहिए। एक स्पष्ट कथन के बिना एक कचरा कलेक्टर मुक्त मेमोरी के अनुरूप। "निहितार्थ" को केवल कक्षा के उपयोग के बिंदु पर होना चाहिए। कक्षा पुस्तकालय निर्माता को निश्चित रूप से विध्वंसक या निपटान () विधि को स्पष्ट रूप से लागू करना चाहिए।
जावा / सी # संतुष्ट बिंदु 1. सी # में आईडीआईसोपेरी को लागू करने वाला एक संसाधन "गुंजाइश" का उपयोग करने के लिए बाध्य हो सकता है:
void test()
{
using(Resource r = new Resource())
{
r.foo();
}//resource released on scope exit
}
यह बिंदु 2 को संतुष्ट नहीं करता है। प्रोग्रामर को स्पष्ट रूप से ऑब्जेक्ट को एक विशेष "स्कोप" का उपयोग करना चाहिए। प्रोग्रामर एक रिसाव पैदा कर, संसाधन को एक दायरे में स्पष्ट रूप से बाँधना भूल सकते हैं।
वास्तव में संकलक द्वारा "उपयोग" ब्लॉक को अंततः-कोशिश-निपटान () कोड में बदल दिया जाता है। यह कोशिश-अंत-निपटान () पैटर्न का एक ही स्पष्ट प्रकृति है। एक अंतर्निहित रिलीज के बिना, एक स्कोप का हुक सिंटैक्टिक चीनी है।
void test()
{
//Programmer forgot (or was not aware of the need) to explicitly
//bind Resource to a scope.
Resource r = new Resource();
r.foo();
}//resource leaked!!!
मुझे लगता है कि यह जावा / सी # में एक भाषा सुविधा बनाने के लायक है, जो विशेष वस्तुओं को अनुमति देता है जो स्मार्ट-पॉइंटर के माध्यम से स्टैक को झुकाते हैं। सुविधा आपको एक वर्ग को स्कोप-बाउंड के रूप में फ़्लैग करने की अनुमति देगी, ताकि यह हमेशा हुक से स्टैक के साथ बनाया जाए। विभिन्न प्रकार के स्मार्ट पॉइंटर्स के लिए विकल्प हो सकते हैं।
class Resource - ScopeBound
{
/* class details */
void Dispose()
{
//free resource
}
}
void test()
{
//class Resource was flagged as ScopeBound so the tie to the stack is implicit.
Resource r = new Resource(); //r is a smart-pointer
r.foo();
}//resource released on scope exit.
मुझे लगता है कि निहितार्थ "इसके लायक" है। जिस तरह कचरा संग्रह का निहितार्थ "इसके लायक" है। स्पष्ट उपयोग करने वाले ब्लॉक आंखों पर ताज़ा होते हैं, लेकिन कोशिश-अंत-निपटान () पर कोई अर्थ लाभ नहीं मिलता है।
क्या जावा / सी # भाषाओं में ऐसी सुविधा को लागू करना अव्यावहारिक है? क्या पुराने कोड को तोड़े बिना इसे पेश किया जा सकता है?
using
के निष्पादन के Dispose
लिए गारंटी दी जाती है (ठीक है, बिना किसी अपवाद के अचानक मरने वाली प्रक्रिया को छूट देना, जिस बिंदु पर सभी सफाई संभवतः मूक हो जाती है)।
struct
Dispose
एस कर रहे हैं कभी चलाने के लिए, कि वे किस तरह शुरू हो रहे हैं की परवाह किए बिना। दायरे के अंत में निहित विनाश को जोड़ने से मदद नहीं मिलेगी।