2009-10-15 24 views
6

एक वीबी.नेट कार्यक्रम में मैं एक नई बिटमैप छवि बना रहा हूं, फिर मैं ग्राफिक्स को कॉल करता हूं। बिटमैप पर ग्राफिक्स ऑब्जेक्ट प्राप्त करने के लिए ग्राफिक्स ऑब्जेक्ट प्राप्त करने के लिए। तब छवि को उपयोगकर्ता को प्रदर्शित किया जाता है।क्या मुझे ग्राफिक्स को कॉल करने की आवश्यकता है। प्रदर्शन()?

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

उत्तर

5

हां।

IDisposable लागू करने वाले किसी भी ऑब्जेक्ट पर हमेशा Dispose() पर कॉल करें। ग्राफिक्स ऑब्जेक्ट्स द्वारा उपयोग किए जाने वाले जीडीआई हैंडल अप्रबंधित हैं और जब आप उनके साथ समाप्त हो जाते हैं तो निपटान की आवश्यकता होती है।

सर्वोत्तम अभ्यास using ब्लॉक में लपेटना है। बीटीडब्लू इस विषय पर कई सारे प्रश्न हैं।

+0

क्षमा करें अगर यह एक डुप्लिकेट है। मैंने इस विशिष्ट मामले से संबंधित कुछ भी नहीं देखा और उत्सुक था कि इस मामले में अप्रबंधित संसाधनों का क्या उपयोग किया जाएगा (यदि कोई है)। – alnorth29

1

हां, आपको निपटान करना चाहिए। यह डिस्क को छूने से संबंधित नहीं है; यह अप्रबंधित संसाधनों का उपयोग करने से संबंधित है जिन्हें ऑपरेटिंग सिस्टम पर ठीक से रिलीज़ करने की आवश्यकता है। Graphics ऑब्जेक्ट के मामले में, मुझे लगता है कि यह डिवाइस संदर्भ हैंडल आवंटित करता है जिसे रिलीज़ किया जाना चाहिए जब उन्हें अब आवश्यकता नहीं है।

6

इसे में उस दायरे के लिए का उपयोग करके इसे लपेटें जिसमें आपको इसकी आवश्यकता है। तब के बारे में स्पष्ट रूप से चिंता मत करो निपटान बुला()

स्यूडोकोड:

using(new Graphics() = Graphics.FromImage) 
{ 
    //Magic happens... 
} 
1

Dispose() साथ नियम यह है कि आप एक वस्तु है कि है IDisposable बनाया है, तो फिर आप इसे कहते हैं की अपेक्षा की जाती है। सबसे अच्छा तरीका using ब्लॉक या finally के भीतर है।

ऐसा हो सकता है कि आपको ऐसा करने की आवश्यकता नहीं है, लेकिन निपटान() इसका निर्णय लेगा।

यदि आपको ऑब्जेक्ट मिला है, लेकिन कन्स्ट्रक्टर को कॉल नहीं किया गया है, तो आपको उस विधि के लिए प्रलेखन की जांच करनी होगी जो यह देखने के लिए लौटाएगा कि क्या यह आपको निपटान() या कॉल करने की अपेक्षा करता है।

+0

सटीक होने के लिए, 'उपयोग' का उचित उपयोग (अन्य उत्तरों देखें) स्पष्ट रूप से 'निपटान' करता है, इसलिए आपको इसे स्वयं कॉल करने की आवश्यकता नहीं है। – ToolmakerSteve

0

Graphics implements IDisposable, इसलिए आपको अप्रबंधित संसाधनों को साफ करने के लिए निपटान करना चाहिए।

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

यह सुनिश्चित करने का सबसे आसान तरीका है कि सभी मामलों में निपटान को उपयोग करने के लिए उपयोग करना है। जैसे

using(var g = Graphics.FromImage()) { 
    // use the resource 
} 
+0

"उन्हें मैन्युअल रूप से संभाला जाना चाहिए" जैसा कि आपने थोड़ी देर बाद लिखा था, सख्ती से सच नहीं है। 'आईडीस्पोजेबल 'के उचित कार्यान्वयन को यह सुनिश्चित करना चाहिए कि मैन्युअल (आपके कोड में) निपटान किए बिना भी आप सुरक्षित रहेंगे। –

+0

@MaciejDopieralski: मैन्युअल प्रक्रिया होने के लिए मुझे कोड लिखने के लिए कुछ भी विचार करना होगा।यदि आप कॉल करना भूल जाते हैं तो सफाई का निपटान नहीं होगा। दूसरी ओर प्रबंधित वस्तुओं का संग्रह स्वचालित रूप से होता है। –

+0

यदि आप अपनी कक्षाओं के बारे में बात कर रहे हैं तो हाँ, लेकिन सभी .NET ढांचे 'आईडीस्पोजेबल' कक्षाएं जल्द या बाद में निपटाई जाती हैं भले ही आप अपने कोड में 'निपटान' न करें। –

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