2010-03-09 10 views
12

में ऑब्जेक्ट्स कैसे मुक्त करूं? क्या कोई मुझे बता सकता है कि मैं सी # में ऑब्जेक्ट कैसे मुक्त कर सकता हूं?मैं सी #

Object obj1 = new Object(); 
//Some code using obj1 
/* 
Here I would like to free obj1, 
after it is no longer required 
and also more importantly 
its scope is the full run time of the program. 
*/ 

अपने सभी मदद

उत्तर

7

आप की जरूरत नहीं है के लिए धन्यवाद: उदाहरण के लिए, मैं एक वस्तु है। आप बस उन्हें संदर्भित करना बंद कर देते हैं, और कचरा कलेक्टर (कुछ बिंदु पर) उन्हें आपके लिए मुक्त कर देगा।

आपको लगता है कि अप्रबंधित संसाधनों का उपयोग प्रकार पर IDisposable लागू, और किसी भी उदाहरण है कि एक using बयान में IDisposable लागू करता लपेट चाहिए।

+2

या इसके बजाय केवल C++/CLI का उपयोग करें, इसलिए आपको यह याद रखना नहीं है कि कौन से प्रकार IDISposable लागू करते हैं और जो नहीं करते हैं, यह ऑब्जेक्ट को स्वचालित रूप से कॉल करेगा जब ऑब्जेक्ट स्कोप से बाहर हो जाता है (यदि हैंडल के रूप में घोषित नहीं किया गया है) –

+4

सी ++/सीएलआई का उपयोग करने के लिए शायद ही कोई अनिवार्य कारण! :) –

+0

@ बेन वोजिट यदि आप सही ढंग से आईडीस्पोज़ेबल को कार्यान्वित करते हैं तो डिसपोज़ फ़ंक्शन को सी # में दायरे से बाहर होने पर भी कॉल किया जाएगा। –

0

आप उन्हें संदर्भित करना बंद कर देते हैं और कचरा कलेक्टर उन्हें ले जाने देते हैं।

आप वस्तु मुक्त करना चाहते हैं, निम्न पंक्ति जोड़ें:

obj1 = null;

कचरा कलेक्टर यदि वस्तु को नष्ट करने के लिए स्वतंत्र (वस्तु के लिए कोई अन्य सूचक है कि यह जीवित रहता है देखते हैं प्रदान की ।)

+1

नलिंग संदर्भों को परेशान न करें जब तक संदर्भ एक स्थिर न हो। अंततः संदर्भ गुंजाइश से बाहर हो जाएगा जो उदाहरण को कचरा संग्रह के लिए योग्य बना देगा। –

16

आपको यह नहीं करना है। रनटाइम का कचरा कलेक्टर आपके साथ आएगा और इसे आपके लिए साफ़ कर देगा। यही कारण है कि आप सी # का उपयोग कर रहे हैं और पहले स्थान पर अप्रबंधित सी ++ नहीं हैं :)

+0

क्या जीसी इसे साफ़ कर देगा यदि ऑब्जेक्ट में कोई संदर्भ (या लिंक) नहीं है, या यह ऑब्जेक्ट को भी मुक्त करेगा जब जीसी का पता लगाता है कि किसी बिंदु के बाद ऑब्जेक्ट का उपयोग कोड द्वारा नहीं किया जाता है (भले ही इसका दायरा पूरी आदमी विधि कहती है, जिसके कारण इसका जीवनकाल कार्यक्रम का पूरा रन टाइम होगा)? – assassin

+1

@assasin: जब कोई संदर्भ, अवधि नहीं होती है तो यह एकत्रित होता है। जीसी कंपाइलर का काम नहीं करता है। इसलिए यदि कोई संदर्भ है तो यह एकत्र नहीं कर सकता है, भले ही इसका भविष्य में उपयोग नहीं किया जाएगा। यही कारण है कि हमें स्थैतिक वस्तुओं के बारे में सावधान रहना होगा। लेकिन आपके मुख्य विधि उदाहरण में, यह निर्भर करता है। ढेर के संदर्भ में मुख्य दायरा है। लेकिन जिन वस्तुओं को वे इंगित करते हैं, वे इस पर निर्भर करते हैं कि आपके संदर्भों को फिर से सौंप दिया गया है या नहीं। – Fakrudeen

1

आप using कथन का उपयोग कर सकते हैं। दायरे के बाद वस्तु का संदर्भ हटा दिया जाएगा और कचरा कलेक्टर इसे बाद में एकत्र कर सकता है।

+3

यह केवल IDISposable – Arve

5

आप नहीं करते हैं। यह एक कचरा कलेक्टर स्वचालित रूप से करता है - मूल रूप से जब .NET रनटाइम को स्मृति की आवश्यकता होती है, तो यह चारों ओर घूमती है और उन वस्तुओं को हटा देती है जो उपयोग में नहीं हैं।

इस काम के लिए आपको क्या करना है ऑब्जेक्ट में सभी लिंक्स को हटाना है।

आपके मामले में ....

obj1 = null;

अंत में, तब ऑब्जेक्ट का संदर्भ नहीं दिया गया है और कचरा कलेक्टर से दावा किया जा सकता है।

अधिक जानकारी के लिए आप http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) देख सकते हैं।

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

+2

लागू करने वाली वस्तुओं पर लागू होता है obj1 = null; –

+1

मैं शून्य को असाइन करने का सुझाव देने जा रहा था लेकिन थोड़ा पठन कहता है कि वास्तव में * देरी * कचरा संग्रह सी # में कर सकता है। बहुत दिलचस्प। इस लेख को और अधिक देखें कि आपको सी # में शून्य क्यों नहीं देना चाहिए: http://blogs.msdn.com/csharpfaq/archive/2004/03/26/97229।एएसपीएक्स –

+0

इसके साथ एक समस्या तब होती है जब आप किसी अन्य प्रक्रिया में स्थित COM ऑब्जेक्ट्स का आविष्कार कर रहे होते हैं। दूसरी प्रक्रिया को शास्त्रीय "COM सर्वर चेतावनी" संवाद मिलेगा क्योंकि सी # संदर्भ को संदर्भित करने की अनुमति देता है। मैं निश्चित रूप से शून्य से संदर्भ स्थापित करने के लिए निश्चित रूप से उस पर निपटने पर प्रभाव डालता हूं। –

3

यह अनुशंसा नहीं कर रहा है, लेकिन क्या तुम सच में करने के लिए, आप के माध्यम से कचरा संग्रहण मजबूर कर सकते हैं की जरूरत है:

GC.Collect(); 
+9

जीसी कॉल करने के लिए इसकी अनुशंसा नहीं की जाती है। Http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx – Arve

+4

किसी को कॉल करने का सुझाव दें GC.Collect() खराब सलाह आईएमओ है। –

0

के रूप में दूसरों का उल्लेख किया है आपने उन्हें स्पष्ट मुक्त करने के लिए जरूरत नहीं है, हालांकि कुछ ऐसा नहीं बताया गया है, जबकि यह सच है कि इनबिल्ट कचरा कलेक्टर उन्हें आपके लिए मुक्त कर देगा, कचरा कलेक्टर इसे मुक्त करने की कोई गारंटी नहीं है।

आप सभी जानते हैं कि जब यह दायरे से बाहर हो गया है तो इसे जीसी द्वारा साफ किया जा सकता है और कुछ चरण में।

0

जैसा कि क्रिस ने बताया कि सी # आपके लिए कचरे के अधिकांश संग्रह करता है। उदाहरण जहां आपको कचरा संग्रह पर विचार करने की आवश्यकता होगी IDisposable इंटरफ़ेस के कार्यान्वयन के साथ और WeakReference का उपयोग करते समय। अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/system.idisposable.aspx और http://msdn.microsoft.com/en-us/library/system.idisposable.aspx देखें।

0

जीसी सभी अप्रबंधित संसाधनों को एकत्र करेगा।

अप्रबंधित संसाधनों को IDisposable लागू करना चाहिए। यदि आप किसी ऑब्जेक्ट का उपयोग कर रहे हैं जो IDisposable लागू करता है, तो आपको ऑब्जेक्ट की Dispose() विधि को कॉल करना चाहिए जब इसकी आवश्यकता नहीं है या using कथन में इसका उदाहरण लपेटें।