2009-12-28 3 views
20

जॉन स्कीट made a comment (via Twitter) साथ बयान "का उपयोग":सी #: मेरे <a href="http://soapidotnet.googlecode.com" rel="noreferrer" title="nom">SOApiDotNet</a> कोड (पूर्व अल्फा स्टैक ओवरफ़्लो एपीआई के लिए एक .NET पुस्तकालय) पर HttpWebRequests/HttpWebResponses

@ maximz2005 एक बात मैं ध्यान दिया है बस स्रोत को जल्दी से ब्राउज़ करने से: आपने वेब रेस्पॉन्स का निपटारा नहीं किया है (एसआईसी)। "एफटीडब्ल्यू" कथन का उपयोग "।

वह इंगित करता है कि मुझे इन वेब सत्रों को "उपयोग" कथन में लपेटने की आवश्यकता है। हालांकि, मेरे पास इसके बारे में एक सवाल है: क्या मुझे पूरी चीज़ को लपेटना चाहिए, HttpWebRequest, से शुरू करना चाहिए या क्या मुझे "उपयोग" कथन के बाहर WebRequest बनाना चाहिए और फिर के अंदर प्रतिक्रिया को लपेटना चाहिए? मुझे एहसास है कि अंतर यह है कि, पूर्व में, दोनों वस्तुओं का निपटान किया जाएगा - क्या यह सही है?

अग्रिम धन्यवाद।

उत्तर

42

HttpWebRequest खुद HttpWebResponse के विपरीत डिस्पोजेबल नहीं है। शुरुआती और निर्धारित सफाई की अनुमति देने के लिए आपको डिस्पोजेबल संसाधनों को लपेटना चाहिए। सही ढंग से कार्यान्वित IDisposable पैटर्न किसी भी मुद्दे के बिना Dispose पर एकाधिक कॉल की अनुमति देता है, इसलिए बाहरी उपयोग कथन संसाधन भी लपेटता है कि अपने स्वयं के निपटान के दौरान आंतरिक उपयोग कथन संसाधन का निपटान करता है, यह अभी भी ठीक है।

कोड उदाहरण

var request = (HttpWebRequest)WebRequest.Create("example.com"); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Code here 
} 
+0

तो मुझे यह घोषित करना चाहिए .. बाहर की आवश्यकता है, या क्या? –

+2

हां, इसका मतलब है कि आप एक var अनुरोध = (HttpWebRequest) WebRequest.Create ("http://example.com") करेंगे; (var प्रतिक्रिया = (HttpWebResponse) अनुरोध का उपयोग कर। GetResponse()) { // कोड यहां } –

+1

@Dzmitry, @Benjamin। मैंने आपके उत्तर में बेंजामिन का कोड उदाहरण जोड़ा। –

6

जब आप स्कोप छोड़ते हैं तो एक() {} ब्लॉक (यानी, पहले ब्रैकेट के अंदर) में लिपटे सबकुछ का निपटारा किया जाता है।

मैंने अब तक आपकी लाइब्रेरी का उपयोग नहीं किया है (हालांकि अच्छा लगता है), लेकिन मैं तर्क दूंगा कि आपको स्पष्ट रूप से आपके द्वारा बनाए गए प्रत्येक आईडीस्पोज़ेबल (= के लिए जिम्मेदार) का निपटान करना चाहिए और कॉलर पर वापस नहीं जाना चाहिए।

एक sidenote, क्योंकि मैंने देखा है निपटान के लिए कई चीजों के साथ संघर्ष कर बहुत से लोगों को:

using (var foo = SomeIDisposable) { 
    using (var bar = SomeOtherIDisposable) { 
    } 
} 

जो ऊर्ध्वाधर अंतरिक्ष के एक बहुत जरूरत है के बजाय आप लिख सकते हैं

using (var foo = SomeIDisposable) 
using (var bar = SomeOtherIDisposable) { 
} 
+0

आपका दूसरा पैराग्राफ (जो सही है, मुझे विश्वास है) पहले के विपरीत है। यदि उपयोग-ब्लॉक के अंदर सबकुछ निपटाया गया है, तो आपको आंतरिक उपयोग कथन की आवश्यकता नहीं होगी। – Tomas

+0

मेरी अद्यतन पोस्ट देखें: जब आप निम्न ब्लॉक छोड़ते हैं (...): –

1

आदेश मेमोरी लीक आप हर वस्तु है कि IDisposable लागू करता है पर निपटान बुलाना चाहिए रोकने के लिए। आप यह सुनिश्चित कर सकते हैं कि उपयोग करने वाले कीवर्ड का उपयोग करके निपटान विधि (कोई इरादा नहीं है) क्योंकि यह केवल अंततः ब्लॉक के लिए एक वाक्य रचनात्मक चीनी है।

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

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