2013-08-11 5 views
8

मेरे पास यह कोड है, मुझे चिंता है कि यह "सुरक्षित नहीं है" मैंने उपयोग कथन अंत से पहले निपटान() का उपयोग किया, मेरे लिए यह थोड़ा अजीब है, लेकिन यह ठीक काम करता है। तो, क्या यह सुरक्षित है?क्या होता है यदि मैंने कथन का उपयोग करने से पहले निपटान() कहा था?

using (FileStream stream = new FileStream(SfilePath, FileMode.Open)) 
{ 
    try 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(HighscoresViewModel)); 
     HVM = deserializer.Deserialize(stream) as HighscoresViewModel; 
    } 
    catch (InvalidOperationException) 
    { 
     stream.Dispose(); 
     (new FileInfo(SfilePath)).Delete(); 
     HVM = new HighscoresViewModel(); 
    } 
} 
+0

यह ऑब्जेक्ट को दो बार –

+0

@JeroenvanLangen का निपटान करने का प्रयास करेगा: यह गलत है। एचडब्ल्यूडी का जवाब देखें। – siride

+0

@ साइराइड - 'स्ट्रीम' _will_ दो बार निपटाया जाएगा। जेरोन्स टिप्पणी में एकमात्र त्रुटि शब्द 'कोशिश' है। –

उत्तर

14

प्रलेखन IDisposable.Dispose राज्यों के लिए:

एक वस्तु के निपटान विधि एक बार से अधिक कहा जाता है, तो वस्तु पहले एक के बाद सभी कॉल्स को नजरअंदाज करना चाहिए। अगर ऑब्जेक्ट विधि को कई बार कहा जाता है तो ऑब्जेक्ट को अपवाद नहीं फेंकना चाहिए। निपटान के अलावा इंस्टेंस विधियां ऑब्जेक्ट डिस्प्ले अपवाद को फेंक सकती हैं जब संसाधन पहले ही डिस्पोजेड होते हैं।

मान लीजिए IDisposable सही ढंग से कार्यान्वित किया गया है, यह उपयोग सुरक्षित है। Dispose को दूसरी बार बुलाया जाएगा, और दूसरी बार ऐसा कुछ भी नहीं करेगा।

1

जैसा कि @ एचवीडी ने कहा था कि यह उपयोग सुरक्षित है; लेकिन यह सिफारिश नहीं कर रहा है कारण अगर आप अपने कोड नमूने पर माइक्रोसॉफ्ट Fxcop लागू यह एक FxCop चेतावनी/त्रुटि CA2202: Do not dispose objects multiple times

See here

कौन कहता है

एक विधि कार्यान्वयन कोड रास्तों कि कई कारण बन सकता है शामिल फेंक होगा IDISposable पर कॉल करें। एक ही ऑब्जेक्ट पर कुछ प्रकारों पर बंद() विधि जैसे समकक्ष या निपटान करें।

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