2010-04-22 9 views
6

मैं सोच रहा हूं कि यह क्यों अनुशंसा की जाती है कि हमें अंतिम रूप से प्रबंधित संसाधनों को रिलीज़ करना चाहिए। यदि आप http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx पर कोड उदाहरण देखते हैं, और स्ट्रिंग के लिए खोज करें "दो अलग-अलग परिदृश्यों में निपटान करें (बूल निपटान) निष्पादित करें" और उस टिप्पणी को पढ़ें, तो आप समझेंगे कि मेरा क्या मतलब है।क्यों "अंतिम विधि किसी अन्य ऑब्जेक्ट का संदर्भ नहीं देना चाहिए"?

केवल संभावना है कि मैं सोच सकता हूं कि शायद इस तथ्य के साथ कुछ ऐसा करना है कि अंतिम रूप देने के लिए भविष्यवाणी करना संभव नहीं है। क्या किसी को सही जवाब पता है?

धन्यवाद, मिशाल

उत्तर

11

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

आपको किसी फाइनलाइज़र में करने की ज़रूरत है, इसे अप्रबंधित किया जाता है संसाधन जो आप सीधे हैं। यदि आप अन्य प्रबंधित प्रकारों का संदर्भ दे रहे हैं जिनके संसाधन हैं, तो उन्हें में अपना फ़ाइनलाइज़र में अपना काम करने दें।

+0

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

+0

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

+5

जब तक कोई वस्तु * पहुंच योग्य * हो, तब तक इसे साफ़ नहीं किया जाएगा। यदि आपकी वस्तु को अंतिम रूप दिया जा रहा है, तो यह पहुंच योग्य नहीं है, और किसी भी संदर्भ में यह धारण नहीं है (और इस प्रकार गिनती नहीं है)। – cHao

2

मुझे लगता है कि आपने सिर पर नाखून को काफी ज्यादा मारा है। यदि आप Object.Finalize दस्तावेज़ में शब्द को देखते हैं, तो यह कहता है: See the IDisposable interface for a complementary and more controllable means of disposing resources. "पूरक" जिसका अर्थ है, "इसे करने का दूसरा तरीका" और नियंत्रित करने योग्य .. वास्तव में आपने जो कहा है।

संपादित करें: और जॉन स्कीट ने क्या कहा। कई फाइनेंजर धागे की धारणा ने सुनिश्चित किया है कि मैं या तो सो नहीं रहा हूं, या आज रात बहुत बुरे सपने देख रहा हूं।

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