2011-10-10 10 views
36

मुझे यकीन नहीं है कि मुझे उपयोग की गई वस्तुओं पर Flush() को कॉल करने की आवश्यकता है यदि मैं ऐसा कुछ लिखता हूं:यदि आप "उपयोग" कथन का उपयोग कर रहे हैं तो क्या आपको फ्लश() को स्ट्रीम या लेखक पर कॉल करने की आवश्यकता है?

using (FileStream...) 
using (CryptoStream...) 
using (BinaryWriter...) 
{ 
    // do something 
} 

क्या वे हमेशा स्वचालित रूप से फ़्लश होते हैं? Xzx14 कथन कब उन्हें फ्लश करता है और जब ऐसा नहीं होता है (यदि ऐसा हो सकता है)?

उत्तर

42

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

+0

पास कॉल का उपयोग का अंत? मुझे केवल इतना पता है कि यह धारा का निपटारा करता है, और मैं हर समय अंत में बंद मेथोड को कॉल करता हूं। –

+9

यह आवश्यक नहीं है, निपटान हमेशा स्ट्रीम बंद कर देगा, और बंद करें स्ट्रीम को पहले फ्लश करेगा। – nos

+1

@ फ़ेलिक्सकज़िलविक: अगर उपयोग करने का अंत बंद नहीं हो रहा था, तो आपके पास खुली धाराएं होंगी और वहां SQLConnections खोलेंगी ...: D –

0

यह बदलता रहता है, Stream डिफ़ॉल्ट रूप से इस तरह के FileStream के रूप में कुछ अपवादों के साथ Dispose विधि में Flush() फोन नहीं करता है। इसका कारण यह है कि कुछ स्ट्रीम ऑब्जेक्ट्स को Flush पर कॉल की आवश्यकता नहीं है क्योंकि वे बफर का उपयोग नहीं करते हैं। कुछ, जैसे MemoryStream यह सुनिश्चित करने के लिए विधि को ओवरराइड करते हैं कि कोई कार्रवाई नहीं की जाती है (इसे नो-ऑप बनाते हैं)।
इसका मतलब है कि यदि आपके पास वहां अतिरिक्त कॉल नहीं है तो आपको यह जांचना चाहिए कि Stream सबक्लास आप Dispose विधि में कॉल लागू कर रहे हैं या नहीं, और यह आवश्यक है या नहीं।

भले ही, यह एक अच्छा विचार सिर्फ पठनीयता के लिए वैसे भी यह कॉल करने के लिए हो सकता है - कैसे कुछ लोगों को उनके बयान का उपयोग कर के अंत में Close() कॉल करने के लिए इसी तरह की:

using (FileStream fS = new FileStream(params)) 
using (CryptoStream cS = new CryptoStream(params)) 
using (BinaryWriter bW = new BinaryWriter(params)) 
{ 
    doStuff(); 
    //from here it's just readability/assurance that things are properly flushed. 
    bW.Flush(); 
    bW.Close(); 
    cS.Flush(); 
    cS.Close(); 
    fS.Flush(); 
    fS.Close(); 
} 
+1

मैं तर्क दूंगा कि फ्लश और क्लोज़ कॉल जोड़ना सक्रिय रूप से पठनीयता और रखरखाव को नुकसान पहुंचाता है। उपयोग कथन वह है जो आश्वासन देता है कि ऑब्जेक्ट ठीक से निपटान किया गया है, भले ही अपवाद फेंक दिया गया हो। – Palec

+0

@Palec मैं समझता हूं कि स्थिति, यह मैंने देखा है कि कई डेवलपर्स के बीच एक विभाजन मानक है। – TheHitchenator

+0

@Palec इसके अलावा, जैसा कि मेरे उत्तर में बताया गया है - डिफ़ॉल्ट रूप से धाराएं अपने निपटान विधियों में 'फ्लश()' को कॉल नहीं करती हैं, जिसका अर्थ है कि यदि आप किसी ऐसे व्यक्ति द्वारा बनाई गई गैर-मानक स्ट्रीम का उपयोग कर रहे हैं जिसने इसे नहीं माना है बयान का उपयोग बफर को ठीक से फ्लश नहीं करेगा। इस वजह से मैं कहूंगा कि मैन्युअल रूप से फ्लश करने के लिए यह एक अच्छा अभ्यास है - यदि इसकी आवश्यकता नहीं है तो यह कुछ भी नहीं करेगा, लेकिन यदि ऐसा है तो यह सुनिश्चित करेगा कि बफर का उचित तरीके से निपटान किया जा रहा है। – TheHitchenator

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

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