2009-04-15 4 views
6

में किसी उपयोग कथन के उपयोग को लागू करना संभव है क्या वास्तव में मेरी कक्षा को किसी प्रकार की विशेषता के साथ सजाने में सक्षम होना चाहिए जो एक उपयोग कथन के उपयोग को लागू करेगा ताकि कक्षा हमेशा सुरक्षित रूप से निपटाई जा सके और स्मृति रिसाव से बचें। किसी को ऐसी तकनीक के बारे में पता है?क्या सी #

+0

एक अलग डिस्पोजेबल वस्तु में अपनी वस्तु एम्बेड करने के बारे में क्या? –

+0

IDISposable के साथ आपकी कक्षा को सजाने के लिए आपकी कक्षा के उपभोक्ताओं के लिए ध्वज होना है कि उन्हें या तो एक प्रयोग में लपेटना चाहिए, या निपटान कॉल करना चाहिए। यदि आप "उपयोग" तकनीक को लागू करते हैं, तो आप प्रभावी ढंग से अपने अच्छे उपभोक्ताओं से कह रहे हैं "मुझे लगता है कि आप कॉल करने के लिए बहुत मोटे हैं", और उपयोग सीमित कर रहे हैं। –

+0

मैं यह भी कहना चाहता था, क्या आप निश्चित रूप से ऐसे परिदृश्य नहीं हैं जहां कोई व्यक्ति आपकी ऑब्जेक्ट को एक विधि में बनाना चाहे और दूसरे में इसका निपटान कर सके? (शायद वे भी IDISposable हैं)। आप इसे करने के लिए किसी के लिए असंभव बना रहे हैं। –

उत्तर

13

ठीक है, ऐसा करने का एक तरीका है जिसे आप ऐसा कर सकते हैं - केवल एक स्थिर विधि के माध्यम से अपने ऑब्जेक्ट तक पहुंच की इजाजत देता है जो एक प्रतिनिधि लेता है। एक बहुत ही सरल उदाहरण के रूप में (जाहिर है वहाँ के रूप में एक फ़ाइल को खोलने के कई अलग अलग तरीके हैं -/आदि लिखने पढ़ने के लिए):

public static void WorkWithFile(string filename, Action<FileStream> action) 
{ 
    using (FileStream stream = File.OpenRead(filename)) 
    { 
     action(stream); 
    } 
} 

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

यह तकनीक निश्चित रूप से सीमित करती है कि आप अपनी वस्तु के साथ क्या कर सकते हैं, लेकिन कुछ मामलों में यह उपयोगी हो सकता है।

+2

मुझे थोड़ा सा गंदा महसूस हुआ।* अब बेहतर लगता है कि इसमें स्कीट समर्थन है * –

+0

यह किसी भी माध्यम से "नया" पैटर्न नहीं है - नहीं कि मैं अभी नाम याद कर सकता हूं ... –

5

आप इस नियम को लागू करने के लिए FxCop का उपयोग कर सकते हैं। quick overview के लिए विकिपीडिया देखें।

+0

लोग * कक्षाओं * का उपयोग करते समय मदद नहीं करते हैं - वह अपने उपयोगकर्ताओं को FxCop – ChrisF

+0

अच्छा बिंदु उपयोग करने के लिए नहीं कह सकता है। लेकिन यह उनकी समस्या है ...: डी –

+0

इसे निर्माण का एक हिस्सा बनाओ और उन्हें इसका ध्यान देना होगा। –

0

यदि आप यह सुनिश्चित करना चाहते हैं कि आपकी वस्तु हमेशा निपटाई जाए, तो IDISposable के साथ संयोजन में अंतिमकरण का उपयोग करें।

लेकिन इससे पहले कि आप IDISposable और finalizers पर पढ़ लें, और इस तथ्य से अवगत रहें कि आपको आमतौर पर तब तक आवश्यकता नहीं है जब तक कि आपकी कक्षा किसी अप्रबंधित संसाधन के जीवनकाल को प्रबंधित करने की तरह कुछ न करे।

एक अंतिमकर्ता के साथ आपकी वस्तु को 'आखिरकार' पुनः प्राप्त किया जाएगा चाहे वह उपयोग में लपेटा गया हो या नहीं। उपयोग कथन, जो IDISposable के लिए एक सुविधा है, निर्धारित करने के लिए निर्धारक सफाई की अनुमति देता है। एकमात्र चेतावनी यह है कि फाइनलाइजर्स के साथ ऑब्जेक्ट को साफ करने के लिए अधिक महंगा होता है और सामान्य रूप से स्मृति में चारों ओर छड़ी होती है, जबकि वे अंतिम रूप देने की प्रतीक्षा करते हैं।

रेफरी When do I need to implement a finalizer or IDisposable? या technorabble: Using Dispose, Finalizers and IDisposable