.Net

2010-06-15 31 views
5

(1) में अंतिम रूप देने की लागत मैंने आईडीस्पोजेबल के बारे में बहुत सारे प्रश्न पढ़े हैं, जहां उत्तर अंतिम रूप से उपयोग करने की अनुशंसा नहीं करते हैं जब तक आपको वास्तव में शामिल प्रक्रिया समय की आवश्यकता नहीं होती है।
जो मैंने नहीं देखा है वह यह है कि यह लागत कितनी है और कितनी बार इसका भुगतान किया जाता है। हर मिलीसेकंद? दूसरा? घंटा, दिन इत्यादि.Net

(2) साथ ही, मुझे लगता है कि अंतिम रूप आसान है जब यह किसी ऑब्जेक्ट का निपटारा नहीं किया जा सकता है। उदाहरण के लिए, ढांचा फ़ॉन्ट वर्ग। एक नियंत्रण इसका निपटान नहीं कर सकता क्योंकि यह नहीं जानता कि फ़ॉन्ट साझा किया गया है या नहीं। फ़ॉन्ट आमतौर पर डिज़ाइन समय पर बनाया जाता है ताकि उपयोगकर्ता इसे निपटाने के बारे में नहीं जान सके, इसलिए अंत में कोई संदर्भ नहीं होने पर इसे छुटकारा पाने के लिए किक्स को अंतिम रूप दिया जाता है। क्या यह एक सही प्रभाव है?

+4

इसे पढ़ें: http://msdn.microsoft.com/en-us/library/ms973837.aspx –

+0

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

+0

... तुरंत' इसे हटाएं '। निश्चित रूप से एक अजीब पैटर्न, सुनिश्चित करने के लिए, लेकिन मूल रूप से इस तथ्य का संकेत है कि .NET को 'FontInfo' वर्ग या नियंत्रण' 'फ़ॉन्ट' गुण के लिए संरचना का उपयोग करना चाहिए था। – supercat

उत्तर

7

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

+0

जो मैं दे सकता था उससे बेहतर स्पष्टीकरण। – Meiscooldude

4

अंतिम रूप निपटान से धारणात्मक अलग है। अंतिम रूप केवल मुक्त अप्रबंधित संसाधनों कर सकते हैं। निपटान में कामयाब मुक्त कर सकते हैं । और अप्रबंधित संसाधनों आप उचित रूप में प्रत्येक का उपयोग करना चाहिए (ध्यान दें कि एक finalizer के साथ एक वर्ग हमेशा IDisposable को लागू करना चाहिए)

निपटान स्पष्ट रूप से ही बुलाया जाना चाहिए अंतिम रूप केवल जी सी द्वारा कहा जा सकता है

अद्यतन।।।: How to Implement IDisposable and Finalizers: 3 Easy Rules पर मेरा ब्लॉग पोस्ट देखें।

+0

काफी सही नहीं है। आपको फाइनलजर को छोटा रखना चाहिए, लेकिन अगर आपको वहां काम करने की ज़रूरत है तो आप कर सकते हैं। (डिबगिंग दिनचर्या दिमाग में आती हैं) – Spence

+1

ध्यान दें कि आप यह नहीं मान सकते कि किसी ऑब्जेक्ट को ऑब्जेक्ट को अंतिम रूप देने के अलावा अन्य वस्तु मौजूद है। – Spence

+0

@ स्पेन्स - आपकी दूसरी टिप्पणी यह ​​है कि आपकी पहली टिप्पणी आम तौर पर क्यों संभव नहीं है। ;) कुछ कंसोल हैं, जैसे कि 'कंसोल। राइटलाइन', लेकिन एक सामान्य नियम के रूप में, जिसे मैं "शट डाउन लॉजिक" कहता हूं, केवल 'निपटान' में ही संभव है और अंतिम नहीं है। –

0

अंतिमकरण डबल चेक के रूप में बेहद उपयोगी है। यदि किसी दुर्घटना या किसी का बुरा कोड आपके ऑब्जेक्ट को दायरे से बाहर नहीं होने से पहले निपटान नहीं करता है, तो गारंटी है कि इसके संसाधन अंतिम रूप में जारी किए जाएंगे।

आप अपने डिस्पोजेर में कुछ फैंसी फुटवर्क कर सकते हैं हालांकि GC.SuppressFinalize(this) पर कॉल करके आपको एक ऐसी विधि लिखने की अनुमति मिल जाएगी जो दोनों स्थितियों में काम करेगी और आपको गारंटी देगी कि कोड अच्छी तरह से काम करेगा।

यदि आप लोगों को याद दिलाने के लिए एक ढांचा लिख ​​रहे थे तो उन्हें एक एमडीए भी आग लग सकती है कि उन्हें आपकी वस्तु का निपटान करना चाहिए।

फाइनलर का जुर्माना मूल रूप से है कि आप अपनी वस्तु को स्तर 2 कतार में धक्का देते हैं जो लंबे समय तक चलने में लगती है। यदि आप निरंतर ऑब्जेक्ट्स का उपयोग कर रहे हैं और वे इसे अंतिम रूप दे रहे हैं तो परिणामस्वरूप आपके स्तर के फाइनल को चलाने के लिए केवल एक स्तर 2 संग्रह हो सकता है।

1

मैं आपके दूसरे प्रश्न का उत्तर दूंगा।

नहीं, Finalize इस तरह से उपयोग नहीं किया जाना चाहिए। वास्तव में, केवल कुछ बहुत ही कमजोर मामलों के अपवाद के साथ, आपको केवल Finalize (या सी # में विनाशक घोषित करें) को ओवरराइड करना चाहिए यदि कक्षा सीधे अप्रबंधित संसाधन रखती है।

आपके द्वारा वर्णित मुद्दा स्वामित्व में से एक है। IDisposable वर्ग का मालिक अपने जीवनकाल और Dispose पर कॉल करने का निर्णय लेने के लिए ज़िम्मेदार है। कोड के अन्य भाग उस वर्ग का उपयोग करने के लिए स्वतंत्र हैं, लेकिन चूंकि वे स्वामित्व का दावा नहीं कर सकते हैं, इसलिए उन्हें उस वर्ग के जीवनकाल प्रबंधन में भाग नहीं लेना चाहिए।

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