लेख में, वस्तुओं के नए उदाहरणों को कोड करना, मैंने विभिन्न तरीकों के बारे में लिखा है नया वस्तुओं के उदाहरण बनाए जा सकते हैं। विपरीत समस्या, किसी वस्तु को निपटाना, कुछ ऐसी चीज है जिसके बारे में आपको VB.NET में बहुत बार चिंता नहीं करनी होगी। .NET में एक तकनीक शामिल है जिसे कहा जाता है कचरा इकट्ठा करने वाला (जीसी) है कि आमतौर पर चुपचाप और कुशलता से पर्दे के पीछे सब कुछ का ख्याल रखता है। लेकिन कभी-कभी, आमतौर पर फ़ाइल स्ट्रीम, sql ऑब्जेक्ट या ग्राफ़िक्स (GDI +) ऑब्जेक्ट (अर्थात) का उपयोग करते समय अप्रबंधित संसाधन), आपको अपने कोड में वस्तुओं को निपटाने का नियंत्रण लेने की आवश्यकता हो सकती है।
सबसे पहले, कुछ पृष्ठभूमि
बस के रूप में एक चोरसंरचनाकार (ए नया कीवर्ड) एक नया बनाता है वस्तु, ए डेस्ट्रक्चर एक ऐसी विधि है जिसे किसी वस्तु के नष्ट होने पर कहा जाता है। लेकिन एक पकड़ है। .NET बनाने वाले लोगों ने महसूस किया कि यह बग के लिए एक फार्मूला था यदि कोड के दो अलग-अलग टुकड़े वास्तव में एक वस्तु को नष्ट कर सकते हैं। तो .NET GC वास्तव में नियंत्रण में है और यह आमतौर पर एकमात्र कोड है जो ऑब्जेक्ट के उदाहरण को नष्ट कर सकता है। जीसी किसी वस्तु को तब नष्ट कर देता है जब वह पहले तय करता है और पहले नहीं। आम तौर पर, एक वस्तु के दायरे से निकलने के बाद, यह होता है
रिहा आम भाषा रनटाइम (सीएलआर) द्वारा। जीसी नष्ट कर देता है जब CLR को अधिक मुफ्त मेमोरी की आवश्यकता होती है। तो लब्बोलुआब यह है कि आप अनुमान नहीं लगा सकते हैं कि जीसी वास्तव में वस्तु को नष्ट कर देगा या नहीं।(Welllll... यह सच है लगभग समय के सभी। आप कॅाल कर सकते हैं GC.Collect और बल ए कचरा संग्रह चक्र, लेकिन अधिकारियों का कहना है कि यह एक है खराब विचार और पूरी तरह से अनावश्यक।)
उदाहरण के लिए, यदि आपके कोड ने a बनाया है ग्राहक ऑब्जेक्ट, ऐसा लग सकता है कि यह कोड इसे फिर से नष्ट कर देगा।
ग्राहक = कुछ भी नहीं
लेकिन यह नहीं है। (ऑब्जेक्ट को कुछ भी नहीं सेट करना आमतौर पर कहा जाता है, dereferencing वस्तु।) वास्तव में, इसका मतलब यह है कि चर अब किसी वस्तु से जुड़ा नहीं है। कुछ समय बाद, जीसी नोटिस करेगा कि वस्तु विनाश के लिए उपलब्ध है।
वैसे, प्रबंधित वस्तुओं के लिए, यह वास्तव में आवश्यक नहीं है। हालाँकि बटन जैसी कोई वस्तु एक डिस्पोज़ विधि की पेशकश करेगी, लेकिन इसका उपयोग करना आवश्यक नहीं है और कुछ लोग करते हैं। उदाहरण के लिए, विंडोज फॉर्म घटकों को कंटेनर ऑब्जेक्ट में जोड़ा जाता है अवयव. जब आप किसी फॉर्म को बंद करते हैं, तो उसकी डिस्पोज़ विधि को स्वचालित रूप से कहा जाता है। आमतौर पर, आपको अप्रबंधित वस्तुओं का उपयोग करते समय केवल इस बारे में चिंता करनी होगी, और फिर भी बस अपने प्रोग्राम को ऑप्टोमाइज़ करना होगा।
किसी भी संसाधन को किसी ऑब्जेक्ट द्वारा जारी करने का अनुशंसित तरीका कॉल करना है निपटान ऑब्जेक्ट के लिए विधि (यदि कोई उपलब्ध है) और फिर ऑब्जेक्ट को डिरेल करें।
ग्राहक। निपटान () ग्राहक = कुछ भी नहीं
क्योंकि जीसी एक अनाथ वस्तु को नष्ट कर देगा, चाहे आप ऑब्जेक्ट चर को कुछ भी सेट न करें, यह वास्तव में आवश्यक नहीं है।
यह सुनिश्चित करने के लिए एक और अनुशंसित तरीका है कि ऑब्जेक्ट तब नष्ट हो जाते हैं जब उनकी आवश्यकता नहीं होती है, किसी ऑब्जेक्ट का उपयोग करने वाले कोड को एक में डालना है का उपयोग करते हुए खंड मैथा। जब आपका कोड उनके साथ समाप्त हो जाता है तो एक ब्लॉक का उपयोग एक या अधिक ऐसे संसाधनों के निपटान की गारंटी देता है।
GDI + श्रृंखला में, द का उपयोग करते हुए ब्लॉक उन pesky ग्राफिक्स ऑब्जेक्ट्स को प्रबंधित करने के लिए अक्सर उपयोग करने के लिए रखा जाता है। उदाहरण के लिए ...
MyBrush को LinearGradientBrush _ के रूप में उपयोग करना। = न्यू लीनियरग्रैडब्रश (_ मेरे। ClientRectangle, _। रंग। नीला रंग। लाल, _। LinearGradientMode। क्षैतिज) <... ...> अंत का उपयोग करना
myBrush ब्लॉक के अंत में निष्पादित होने पर स्वचालित रूप से निपटाया जाता है।
मेमोरी को प्रबंधित करने के लिए जीसी दृष्टिकोण वीबी 6 ने इसे करने के तरीके से एक बड़ा बदलाव है। संदर्भों का एक आंतरिक काउंटर शून्य तक पहुंचने पर COM ऑब्जेक्ट (VB6 द्वारा उपयोग किया गया) नष्ट हो गया। लेकिन गलती करना बहुत आसान था इसलिए आंतरिक काउंटर बंद था। (क्योंकि मेमोरी तब बंधी हुई थी और ऐसा होने पर अन्य वस्तुओं के लिए उपलब्ध नहीं था, इसे "मेमोरी लीक" कहा जाता था।) इसके बजाय, जीसी वास्तव में यह देखने के लिए जांचता है कि क्या कोई वस्तु किसी वस्तु को संदर्भित कर रही है और अधिक नहीं होने पर उसे नष्ट कर देती है संदर्भ। जीसी दृष्टिकोण का जावा जैसी भाषाओं में एक अच्छा इतिहास है और .NET में बड़े सुधारों में से एक है।
अगले पृष्ठ पर, हम आईडीसोफ़रेबल इंटरफ़ेस में देखते हैं... जब आप अपने स्वयं के कोड में अप्रबंधित वस्तुओं को निपटाने की आवश्यकता हो तो उपयोग करने वाला इंटरफ़ेस।
यदि आप अपनी स्वयं की ऑब्जेक्ट को कोड करते हैं जो अप्रबंधित संसाधनों का उपयोग करता है, तो आपको इसका उपयोग करना चाहिए IDisposable वस्तु के लिए इंटरफ़ेस। Microsoft एक आसान कोड स्निपेट शामिल करके इसे आसान बनाता है जो आपके लिए सही पैटर्न बनाता है।
चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
वापस जाने के लिए अपने ब्राउज़र पर बैक बटन पर क्लिक करें
जोड़ा गया कोड इस तरह दिखता है (VB.NET 2008):
क्लास रिसोर्सक्लास। औजार 'निरर्थक कॉल का पता लगाने के लिए। निजी बूलियन के रूप में निपटाया = गलत। 'पहचान योग्य। संरक्षित उप-योग्य उप-निपटान (_ बूलियन के रूप में निपटान द्वारा) अगर मैं नहीं तो फिर। यदि निस्तारण हो तो। 'मुक्त अन्य राज्य (प्रबंधित वस्तुएँ)। अगर अंत। 'अपने राज्य (अप्रबंधित वस्तुएं) को मुक्त करें। 'बड़े क्षेत्रों को अशक्त करने के लिए सेट करें। अगर अंत। Me.disposed = सच। अंत उप। #Rionion "IDisposable Support" 'विज़ुअल बेसिक द्वारा जोड़ा गया यह कोड है। 'सही ढंग से डिस्पोजेबल पैटर्न को लागू करें। पब्लिक सब डिस्पोजल () इम्प्लीमेंट्स आईडीआईजैबली। निपटान। 'इस कोड को न बदलें। 'सफाई कोड डालें। 'उपर्युक्त निपटान (बूलियन के रूप में निपटान)। डिस्पोज़ (ट्रू) GC.SuppressFinalize (मी) एंड सब। संरक्षित ओवरराइड्स सब फाइनल () 'इस कोड को न बदलें। 'सफाई कोड डालें। 'उपर्युक्त निपटान (बूलियन के रूप में निपटान)। डिस्पोजल (झूठा) मायबेस। अंतिम रूप () अंतिम उप। # और क्षेत्र। एंड क्लास
निपटान .NET में लगभग "लागू" डेवलपर डिज़ाइन पैटर्न है। वास्तव में ऐसा करने का केवल एक सही तरीका है और यह है। आप सोच सकते हैं कि यह कोड कुछ जादू करता है। यह नहीं है
पहले ध्यान दें कि आंतरिक ध्वज उतारू बस शॉर्ट-सर्किट पूरी बात तो आप कॉल कर सकते हैं निपटाना (निपटाना) जितनी बार तुम चाहो।
कोड ...
GC.SuppressFinalize (मुझे)
... जीसी को बताकर आपके कोड को अधिक कुशल बनाता है कि वस्तु पहले ही निपट गई है (निष्पादन चक्रों के संदर्भ में एक 'महंगा' ऑपरेशन)। अंतिम रूप संरक्षित है क्योंकि किसी वस्तु के नष्ट हो जाने पर GC उसे स्वचालित रूप से कॉल करता है। आपको कभी भी फाइनल नहीं करना चाहिए। बूलियन निपटान कोड बताता है कि क्या आपके कोड ने ऑब्जेक्ट के निपटान (ट्रू) की शुरुआत की थी या जीसी ने किया था (के भाग के रूप में) अंतिम रूप विषय। ध्यान दें कि बूलियन का उपयोग करने वाला एकमात्र कोड है निपटान है:
यदि निस्तारण हो तो। 'मुक्त अन्य राज्य (प्रबंधित वस्तुएँ)। अगर अंत
जब आप किसी वस्तु का निपटान करते हैं, तो उसके सभी संसाधनों का निपटान किया जाना चाहिए। जब सी.एल.आर. कचरा इकट्ठा करने वाला किसी वस्तु का निपटान केवल उन्मुक्त संसाधनों से किया जाना चाहिए क्योंकि कचरा संग्रहकर्ता स्वचालित रूप से प्रबंधित संसाधनों का ध्यान रखता है।
इस कोड स्निपेट के पीछे विचार यह है कि आप संकेतित स्थानों में प्रबंधित और अप्रबंधित वस्तुओं की देखभाल के लिए कोड जोड़ते हैं।
जब आप एक से एक वर्ग प्राप्त करते हैं आधार वर्ग जब तक कि आप अन्य संसाधनों का उपयोग नहीं करते हैं, तब तक आपको आधार विधियों में से किसी को भी हटाने की जरूरत नहीं है, जब तक कि आपको निपटारा करने की जरूरत नहीं है यदि ऐसा होता है, तो व्युत्पन्न वर्ग को मूल वर्ग के संसाधनों के निपटान के लिए आधार वर्ग के निपटान (निपटान) विधि को ओवरराइड करना चाहिए। लेकिन बेस क्लास की डिस्पोज़ (डिस्पोज़िंग) पद्धति को कॉल करना याद रखें।
संरक्षित ओवरराइड्स सब डिस्पोजल (बूलियन के रूप में निस्तारण करके) यदि मुझे नहीं पता है तो फिर। यदि निस्तारण हो तो। 'प्रबंधित संसाधनों को मुक्त करने के लिए अपना कोड जोड़ें। अगर अंत। 'अप्रबंधित संसाधनों को मुक्त करने के लिए अपना कोड जोड़ें। अगर अंत। MyBase। निपटाना (निपटाना) अंत उप
विषय थोड़ा भारी हो सकता है। यहाँ स्पष्टीकरण का उद्देश्य "ध्वस्तीकरण" करना है जो वास्तव में हो रहा है क्योंकि अधिकांश जानकारी जो आप पा सकते हैं वह आपको नहीं बताती है!