यह है कि मैं क्या "सी # के माध्यम से CLR" से IDisposable और finalizers के बारे में समझना है, "प्रभावी सी #" और अन्य संसाधनों:finalizer साथ सिंगलटन लेकिन IDisposable नहीं
- IDisposable को साफ करने में कामयाब रहे और अप्रबंधित संसाधनों निर्धारणात्मक के लिए है।
- अप्रबंधित संसाधनों (जैसे फ़ाइल हैंडल) के लिए ज़िम्मेदार वर्गों को IDISposable लागू करना चाहिए और यह गारंटी देने के लिए एक अंतिमकर्ता प्रदान करना चाहिए कि क्लाइंट कोड उदाहरण पर निपटान() को कॉल नहीं करता है, भले ही वे साफ़ हो जाएं।
- प्रबंधित संसाधनों के लिए ज़िम्मेदार वर्ग केवल अंतिमकरण को लागू नहीं करना चाहिए।
- यदि आपके पास फाइनेंजर है तो आपको IDISposable लागू करना होगा (यह क्लाइंट कोड को सही चीज़ करने और निपटान() को कॉल करने की अनुमति देता है, जबकि अंतिमकर्ता संसाधन भूलने से रोकता है)। एक सिंगलटन वर्ग कि अप्रबंधित संसाधनों (जैसे केवल एक प्रदान करने के रूप के लिए जिम्मेदार है:
जब मैं तर्क के लिए और ऊपर के सभी के साथ सहमत समझते हैं, वहाँ एक परिदृश्य में जहाँ मुझे लगता है कि यह समझ में आता है इन नियमों को तोड़ने के लिए है विशेष फाइलों तक पहुंच का बिंदु)।
मेरा मानना है कि सिंगलटन पर एक डिस्प्ले() विधि हमेशा गलत है क्योंकि सिंगलटन इंस्टेंस एप्लिकेशन के जीवन के लिए जीना चाहिए और यदि कोई क्लाइंट कोड कॉल() को कॉल करता है तो आप भरे हुए हैं। हालांकि, आप एक फाइनलाइज़र चाहते हैं ताकि जब एप्लिकेशन को अनलोड किया जाए तो फाइनलाइज़र अप्रबंधित संसाधनों को साफ कर सकता है।
तो एक फाइनेंजर के साथ सिंगलटन क्लास होने पर IDISposable को लागू नहीं किया जाता है, ऐसा लगता है कि मुझे ऐसा करने के लिए एक उचित चीज है, फिर भी इस प्रकार का डिज़ाइन जो मैं समझता हूं उसके विपरीत है।
क्या यह एक उचित दृष्टिकोण है? यदि नहीं, तो क्यों नहीं और बेहतर विकल्प क्या हैं?
तथ्य यह है कि यदि आप ऐप के जीवनकाल के दौरान अपनी ऑब्जेक्ट को प्रतिस्थापित करने का कोई कारण समझ सकते हैं, तो ऑब्जेक्ट वैध रूप से सिंगलटन नहीं हो सकता है। क्यों के लिए ... कहो मैंने सिंगलटन को पकड़ लिया और इसे उस सामान में पास कर दिया जिसकी आवश्यकता थी (कारण, पता है, निर्भरता इंजेक्शन एक अच्छी बात है)। फिर कहीं कुछ इसे बदलने का फैसला करता है। अब * दो सिंगलेट * हैं (पुराना मैं चारों ओर गुजर रहा हूं, और नया)। यह संभावना सिंगलटन की पूरी परिभाषा का उल्लंघन करती है - यानी, वह कोड हमेशा एक उदाहरण को देखता है। – cHao
तो, सबसे पहले, पवित्र पुराने उत्तर बैटमैन। दूसरा, आपका उदाहरण समझ में नहीं आता है।यदि आप किसी ऑब्जेक्ट को सिंगलटन का उदाहरण देते हैं और फिर कुछ अन्य ऑब्जेक्ट का निर्णय लेता है कि वह सिंगलटन चाहता है, तो पैटर्न उसके लिए अनुमति देता है - इसे उस ऑब्जेक्ट पर संदर्भ प्राप्त करना चाहिए जो वर्तमान में स्मृति में है। जिस बिंदु को मैं बना रहा था वह यह था कि पैटर्न आपको ऑब्जेक्ट का निपटान करने से रोकता नहीं है। उस स्थिति में, उदाहरण के लिए, यदि ऑब्जेक्ट का निपटारा किया गया था, तो एकल उदाहरण अब मौजूद नहीं होना चाहिए, इसलिए जब कोई अलग ऑब्जेक्ट सिंगलटन का अनुरोध करता है, तो उसे एक नया उदाहरण प्राप्त करना चाहिए। –
यदि ऑब्जेक्ट का निपटारा किया गया है, तो उदाहरण * * अभी भी मौजूद है - जो भी इसे पहले हासिल कर लेता था, उसे अभी भी प्राप्त किया जाएगा। तो यह स्पष्ट रूप से जीसीड नहीं हो सकता है, लेकिन अब यह अनुपयोगी है। एक बहुप्रचारित संदर्भ में उस कथन के परिणामों के बारे में सोचें। 'Singleton.getInstance()। DoStuff() 'जैसी अभिव्यक्ति अब थ्रेड सुरक्षित नहीं है, * भले ही' getInstance' और 'doStuff' दोनों * हैं। दो कॉल के बीच एक धागा आ सकता है और हमने जो उदाहरण हासिल किया है उसका निपटान कर सकते हैं। और यह भी आपके पौराणिक सभी को मानता है-हमेशा-कॉल-'getInstance' परिदृश्य। स्थिर वर्ग के लिए – cHao