2009-12-29 9 views
6

मैं एक .NET प्रोजेक्ट पर काम कर रहा हूं, जिसे कुछ उपयोगकर्ता परिभाषित कक्षाओं के साथ बातचीत करने की आवश्यकता है - "नौकरियां" के रूप में संदर्भित किया गया है। पुस्तकालय के उपभोग के लिए सभी नौकरी कक्षाओं को एक विशिष्ट इंटरफ़ेस IJob लागू करना होगा। कभी-कभी नौकरी कक्षा में अप्रबंधित संसाधन हो सकता है, जिसे स्पष्ट रूप से निपटाया जाना चाहिए।मुझे संभावित रूप से डिस्पोजेबल वस्तुओं का निपटान कैसे सुनिश्चित करना चाहिए?

मुझे यह कैसे सुनिश्चित करना चाहिए कि उपयोग के बाद सभी नौकरियों का सही ढंग से निपटान किया जाए, अगर मुझे पहले से पता नहीं है कि नौकरी को स्पष्ट निपटान की आवश्यकता है? मैं कुछ विचार अपने आप को है, लेकिन अपनी टिप्पणी/सुझाव सुनना पसंद करेंगे:

  1. IJob : IDisposable करें, सभी नौकरियों के लिए मजबूर कर एक Dispose() विधि लागू करने के लिए। यह मुझे using ब्लॉक में नौकरियों के साथ काम करने की अनुमति देगा, लेकिन अधिकांश नौकरियां स्पष्ट निपटान की आवश्यकता होने की उम्मीद नहीं है, इससे क्लाइंट डेवलपर्स के लिए अनजान भ्रम हो सकता है।

  2. try-finally ब्लॉक में नौकरियों को शामिल सभी काम करते हैं, और finally का उपयोग सुनिश्चित करने के लिए कि क्या कार्य को लागू करता है IDisposable कि Dispose() कहा जाता है। इससे ग्राहकों को एक नई नौकरी कक्षा लागू करने में आसान बनाता है - एक खाली Dispose() विधि को लागू नहीं करने के द्वारा - लेकिन यह इस तथ्य को भी छुपाता है कि लाइब्रेरी जानता है और डिस्पोजेबल नौकरियों की परवाह करता है।

इस लिखाई के बाद, मैं # 1 समाधान की दिशा में झुक जाते हैं, लेकिन मैं अभी भी लगता है कि यह वैकल्पिक समाधान को देखने के लिए अच्छा होगा, और अतिरिक्त पेशेवरों/दो के लिए विपक्ष मैं पहले से ही मन में है।

उत्तर

8

से सहमत वहाँ एक मिसाल है दे: स्ट्रीम आधार वर्ग IDisposable नाद है इसलिए सभी स्ट्रीम्स वंशज हैं । लेकिन मेमोरीस्ट्रीम को निपटान की आवश्यकता नहीं है।
लेकिन कोशिश करने के लिए लक्ष्य नहीं है/अंत में, using() { } ब्लॉक एक अधिक सुविधाजनक शॉर्टेंड है।

तो आपकी पसंद यह है: क्या आप चाहते हैं कि सभी नौकरियां आईडीस्पोज़ेबल हों या बस कुछ?

पहला विकल्प एक छोटे से ओवरहेड में प्रवेश करता है, दूसरा दूसरा भूलना आसान बनाता है (उपयोग) जब आवश्यक हो।

+0

अच्छा बिंदु। हालांकि, अधिकांश धाराओं को निपटान की आवश्यकता होगी, और मुझे उम्मीद है कि नौकरियों की केवल अल्पसंख्यक आवश्यकता होगी। –

+0

यह मेरे लिए होता है कि 'System.Web.IHttpModule' को इसके कार्यान्वयनकर्ताओं को' निपटान() 'विधि प्रदान करने की भी आवश्यकता होती है, भले ही केवल कुछ मॉड्यूल (IMHO) को इसकी आवश्यकता हो। मुझे लगता है कि यह # 1 के लिए अतिरिक्त प्राथमिकता प्रदान करता है। –

+1

+1, मुझे लगता है कि इसके अलावा, यह एक नौकरी के लिए एक मानक विधि प्रदान करने के लिए समझ में आता है जो इसे इस्तेमाल करता है। 'आईडीस्पोजेबल' का उपयोग करके आपको ढांचे के समर्थन से लाभ मिलता है और अंत उपयोगकर्ताओं को कम से कम उचित सफाई कोड कहां रखना है, इस बारे में सोचना पड़ता है। – user7116

2

मैं # 2 और दस्तावेज़ के साथ जाऊंगा कि किसी भी डिस्पोजेबल ऑब्जेक्ट का निपटारा किया जाएगा। असल में यदि आप किसी ऑब्जेक्ट का स्वामित्व लेते हैं तो आप उन ऑब्जेक्ट्स को निपटाने के लिए बाध्य हैं जो IDISposable लागू करते हैं।

आप पढ़ सकते हैं प्रभावी सी #/अधिक प्रभावी सी #, बिल वैगनर एक ही सलाह (जो मैं स्पष्ट रूप से ;-)

+0

ओपी पहले से ही दोनों विकल्पों में स्वामित्व वस्तुओं के निपटान किया जाता है, तो मैं नहीं दिख रहा है कि यह कैसे विकल्प # 2 के लिए एक तर्क है। –

3

मुझे इस तरह से लगता है। मैं एक डेवलपर Dispose विधि को लागू करने के लिए भूलने के बजाय एक खाली Dispose विधि लागू करना चाहता हूं।

5

# 2 यह है कि कैसे foreach निर्माण कार्य करता है। यह भी है कि ऑटोफैक का कंटेनर निपटान कैसे काम करता है।

अर्थ अंतर है कि क्या आप का कहना है कि एक नौकरी ही डिस्पोजेबल है, या एक कार्यान्वयन डिस्पोजेबल हो सकता है या नहीं।

यह आपके उदाहरण से स्पष्ट है कि पूर्व सत्य नहीं है, कि नौकरियां स्वाभाविक रूप से डिस्पोजेबल नहीं हैं।इसलिए, मैं # 2 की सलाह देते हैं, लेकिन एक विस्तार विधि के साथ try/finally केंद्रीकृत करने के लिए:

public static void Execute(this IJob job) 
{ 
    try 
    { 
     job.Run(); 
    } 
    finally 
    { 
     var disposableJob = job as IDisposable; 

     if(disposableJob != null) 
     { 
      disposableJob.Dispose(); 
     } 
    } 
} 
+0

+1, मुझे अर्थशास्त्र के बारे में आपका तर्क पसंद है, लेकिन मुझे लगता है कि मैं दूसरे उत्तरों और प्रश्न में उल्लिखित कारणों के लिए पहले समाधान के साथ जाऊंगा। –

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