2012-08-05 10 views
5

मैं नीचे दिए गए डेटा को वापस करते हुए Memory Management का उपयोग कर रहा हूं।डेटा लौटने के दौरान वक्तव्य का उपयोग

private DataSet ReturnDs() 
{ 
    using (DataSet ds = new DataSet()) 
    { 
     return ds; 
    } 
} 

क्वेरी - वहाँ है, जबकि डेटा लौटने 'का प्रयोग' वक्तव्य रखने में किसी भी मुद्दे है? मैं अभी भी पूर्ण स्कीमा के साथ-साथ प्राप्त करने वाले फ़ंक्शन में डेटा प्राप्त कर रहा हूं?

+2

यदि आप कोई ऑब्जेक्ट वापस करना चाहते हैं, तो आप इसका निपटान क्यों करना चाहते हैं? –

+0

@Mert - मैं जानना चाहता हूं कि नुकसान क्या है? क्या डेटा में कोई नुकसान है? मैंने सत्यापित किया कि यह ठीक है ... मेरा सवाल है - क्या कोई गैर लाभकारी है कि मुझे याद आ रही है? –

+0

आपने इसे सत्यापित किया? अच्छा लगा। जिस तरह से बहुत कम लोग वास्तव में औपचारिक तरीकों के साथ अपना कोड साबित करते हैं :) – Joey

उत्तर

4

यह निश्चित रूप से एक गलत पैटर्न है। एकमात्र कारण यह है कि यह आपके लिए काम कर रहा है अब DataSet.Dispose() वास्तव में एक डमी है।

using (DataSet ds = new DataSet()) 
{ 
    return ds; 
} // there is a ds.Dispose() here but it does nothing. 

आप के साथ उदाहरण के लिए एक Enitity ढांचे DbContext तो आप नहीं किसी भी डेटा बुला समारोह में देखना होगा डेटासेट की जगह है।

+0

आपके समर्थन के लिए धन्यवाद .. क्या आप कृपया बता सकते हैं क्यों? –

+0

+1 कोई ऑब्जेक्ट जो वास्तव में अपनी 'निपटान विधि' में कुछ सार्थक करता है, कॉलिंग विधि में "अमान्य" दिखाई देगा। –

+0

@ हेनकहोल्टरमैन - क्या आप कृपया व्याख्या करने के लिए एक लिंक साझा कर सकते हैं ** यहां एक डीएस डिस्प्ले() है लेकिन यह कुछ भी नहीं करता **। –

0

मुझे यकीन नहीं है कि आपका प्रश्न वास्तव में क्या है।

एक बार विधि को फिर से शुरू करने के बाद विधि समाप्त हो जाती है, ds.Dispose() स्वचालित रूप से कॉल किया जाएगा।

इसका मतलब है कि आपकी कॉलिंग विधि प्राप्त होने पर डेटा विधि आपके विधि रिटर्न को पहले ही डिस्पोजेड कर दिया जाएगा।

0

मर्ट टिप्पणी के रूप में, ध्यान दें कि आप जिस वस्तु को वापस कर रहे हैं उसका निपटारा कर रहे हैं। लेकिन मूल रूप से, उपयोग वास्तव में एक कोशिश/आखिरकार है और निपटान विधि विधि कहा जाएगा। प्रभाव प्रत्येक प्रकार के लिए IDisposable कार्यान्वयन पर निर्भर करता है। आम तौर पर, आप उस इकाई को निपटाने (मारने) का अनुमान नहीं लगाते हैं जिसे आप कॉलर पर वापस कर रहे हैं जो शायद इसका उपयोग करेगा।

+0

»दायरे से बाहर निकलें« .. मुझे नहीं लगता कि कथन यहां कोई समझ में आता है। – Joey

2

कॉलिंग विधि में using कथन का उपयोग करें, ऑब्जेक्ट को वापस करने की विधि नहीं। ,

DataSet ds = null; 
try 
{ 
    // code here 
} 
finally 
{ 
    if(ds != null) 
    { 
    ds.Dispose(); 
    ds = null; 
    } 
} 

इसलिए, यदि आप एक विधि में एक using बयान है कि using बयान में वस्तु वापस जाने के लिए माना जाता है प्रयोग किया जाता है यह होगा:

public void Caller() 
{ 
    using(DataSet ds = GetDataSet()) 
    { 
    // code here 
    } 
} 

public DataSet GetDataSet() 
{ 
    // don't use a using statement here 
    return ds; 
} 

using बयान यह कर के रूप में ही मूल रूप से है एक विस्थापित वस्तु (यानी बंद धारा, बंद डेटासेट, आदि ...) का अर्थ है जिसका मतलब है कि कुछ आंतरिक वस्तुएं शून्य या बंद हो सकती हैं। दूसरे शब्दों में, सभी आंतरिक संसाधनों को साफ किया जाएगा, जो कि पहले स्थान पर आईडीस्पोजेबल को लागू करने का उद्देश्य है। यदि आपका आवेदन उपलब्ध कुछ आंतरिक संसाधनों पर निर्भर करता है, उदाहरण के लिए स्ट्रीम ऑब्जेक्ट का उपयोग करते समय, यह अपवाद फेंक देगा।

यह भी ध्यान रखें कि सभी finally ब्लॉक समान नहीं हैं। याद रखें, किसी भी आंतरिक संसाधनों और अप्रबंधित वस्तुओं को साफ करने के लिए पहचान योग्य लागू किया गया था। using कथन के बाहर उन आंतरिक संसाधनों की आवश्यकता नहीं हो सकती है, इसलिए कभी-कभी using कथन का उपयोग करते हुए आप ठीक से काम कर सकते हैं लेकिन इसकी अनुशंसा नहीं की जाती है, और निश्चित रूप से सभी वस्तुओं के साथ काम नहीं करेगा। यदि माइक्रोसॉफ्ट ने भविष्य में रिलीज में डेटासेट ऑब्जेक्ट को बदलने का फैसला किया है, तो आपके आवेदन के लिए कुछ महत्वपूर्ण है, तो आपका कामकाजी कोड अचानक काम करना बंद कर देगा।

+0

क्या आप समझा सकते हैं क्यों? –

+0

@ आरजीआई - अद्यतन उत्तर। –

+0

एक डाउनवोट ?? यह उत्तर कैसे उपयोगी नहीं है ?? –

4

सामान्य शब्दों में, आप जिस ऑब्जेक्ट को वापस करने वाले हैं, उसका निपटारा करना एक त्रुटि है: आपका कोड उस ऑब्जेक्ट के साथ समाप्त नहीं हुआ है, और आप कॉलर को टूटी ऑब्जेक्ट सौंपेंगे।

तो वास्तव में: Dispose() नहीं है, जिसका अर्थ है: किसी ऑब्जेक्ट पर using का उपयोग न करें।यह निपटाने के लिए कॉलर पर निर्भर है: वे अब मालिक हैं। बेशक, यह आदर्श रूप से एपीआई में दस्तावेज किया जाना चाहिए।

अधिक आम तौर पर, आपको अपवादों के बारे में भी सोचने की आवश्यकता है। क्या होता है यदि आपकी विधि त्रुटियां? यह सुनिश्चित करें कि वस्तु विफलता के मामले में सही ढंग से निपटान किया जाता है

SomeType foo = null; 
try { 
    // initialize and populate foo - this could error half-way through 
    return foo; 
} catch { 
    if(foo != null) foo.Dispose(); 
    throw; 
} 

: जटिल परिदृश्यों के लिए, आप की तरह कुछ पड़ सकता है।

+0

+1 क्योंकि आप हेनक के समान ही कह रहे हैं। यह भी सख्ती से यह एक त्रुटि नहीं है, यह सिर्फ बेकार और अर्थहीन है जो कॉलर को मृत वस्तु (और आमतौर पर) कर सकता है। –

+0

मुझे कोई त्रुटि नहीं मिल रही है ... –

+0

@RGI जो डेटासेट के लिए है, निपटान एक नो-ऑप है: http://stackoverflow.com/questions/913228/should-i-dispose- डेटासेट- और-डेटाटेबल और इसलिए मैंने सामान्य मामले में * क्यों उत्तर दिया *। हालांकि, आप जो कर रहे हैं वह भ्रमित है और किसी अन्य प्रकार के लिए त्रुटियों का कारण बन सकता है। ऐसा मत करो –

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