2012-12-27 39 views
7

जब आप सक्रिय StreamWriter पर Close पर कॉल करते हैं तो यह धारा में कोई और कोड लिखना असंभव बनाता है (क्योंकि यह बंद हो गया है)। एक और स्ट्रीम खोलने के लिए, आपको StreamWriter का नया उदाहरण बनाना होगा क्योंकि कोई 'ओपन' विधि नहीं है।बंद() और निपटान() के साथ स्ट्रीमवाइटर का क्या मतलब है?

मेरा प्रश्न है, Close और Dispose होने का क्या मतलब है जब आप वास्तव में स्ट्रीम बंद करने के बाद Dispose के अलावा कुछ भी उपयोग नहीं कर सकते हैं?

मैं समझ सकता हूं कि Open फ़ंक्शन था, यानी आप एक फ़ाइल बंद कर सकते हैं और उसी StreamWriter का उपयोग करके दूसरा खोल सकते हैं। लेकिन जैसा कि केवल Close है और आप वास्तव में Dispose के अलावा कुछ भी उपयोग नहीं कर सकते हैं, क्यों न केवल Close से छुटकारा पाएं और Dispose अंतर्निहित धारा को अपनी पहली क्रिया के रूप में बंद करें?

मुझे लगता है कि DisposeIDisposeable से आता है और यह सब कुछ। मैं क्या जानना चाहता हूं कि Close विशेष रूप से आवश्यक है जब DisposeClose पर कॉल करने के लिए प्रतीत होता है।

जहां तक ​​मैं देख सकता हूँ, एक ही StreamWriter के साथ एक और धारा खोलने की क्षमता के बिना, वहाँ Close होने आप कोई विकल्प नहीं है, लेकिन Dispose के बाद के बाद से अन्य सभी तरीकों बेकार हो जाते हैं जब का कोई मतलब नहीं है।

क्यों है कि StreamWriter परेशान होने Close जब वे एक ही विधि में Close और Dispose मर्ज कर सकते है?

+1

ऐसा लगता है कि आपके पास पीछे की ओर है - 'बंद करें' कॉल 'निपटान करें', दूसरी तरफ नहीं। –

+1

'बंद करें 'कॉल' निपटान ', जो अंतर्निहित स्ट्रीम संसाधन को बंद करता है। –

उत्तर

2

जब धाराओं के साथ काम कर वहाँ एक लंबे समय से परंपरा है Close एक विधि वे धारा को बंद करने के लिए है कि है। यह शब्दावली है कि धाराओं से निपटने के दौरान कई प्रोग्रामर का उपयोग किया जाता है और देखने की उम्मीद होती है। यह Close विधि के बिना स्ट्रीम करने के लिए संभावित रूप से भ्रमित हो रहा होगा, और लोगों को यह महसूस करने में कुछ समय लगेगा कि उन्हें स्ट्रीम को बंद करने के लिए Dispose का उपयोग करना चाहिए।

यह निश्चित रूप से संभव वर्ग के लिए है स्पष्ट रूप से IDisposable लागू कर दिया है, ताकि Dispose विधि वहाँ IDisposable करने के लिए एक डाली के बिना नहीं हो सकता है, और है कि मेरे भ्रम की स्थिति से कुछ साफ है, लेकिन वे नहीं करने के लिए चुन ऐसा करें और कक्षा में दो डुप्लिकेट विधियों को छोड़ दें।

यह पूरी तरह से आपकी व्यक्तिगत प्राथमिकता पर निर्भर करता है कि क्या आप स्ट्रीम को बंद करने के लिए Dispose या Close का उपयोग करते हैं।

+1

मैं इस में कई बार पढ़ा है, कि करीब नदियों और रीडर/लेखकों बस "समापन" एक फ़ाइल के सम्मेलन की वजह का हिस्सा है। मुझे याद नहीं है, लेकिन मुझे लगता है कि सीएलआर में सी # के माध्यम से सूचना की उस सीमा को रेखांकित किया गया था। –

+2

'Close' वास्तव में, नेट 1.0 से सिर्फ एक दोस्ताना नाम अवशेष है इससे पहले कि वे उनके सम्मेलनों नीचे था।माइक्रोसॉफ्ट ने तब से कहा है कि विभिन्न एपीआई में स्थिरता के लिए 'निपटान' को प्राथमिकता दी जानी चाहिए, और तब से एक फीचर-डुप्लिकेटिंग 'क्लोज़' विधि नहीं लिखी है। –

+0

मेरे पिछले कुछ प्रश्नों पर वापस जायें जिनके पास उत्तर नहीं था। मैंने इसे चुना है क्योंकि अन्य सभी उत्तरों मेरे मिश्रण को संबोधित करते हुए लग रहे थे कि क्या 'बंद करें' कॉल का निपटान करें या मेरे वास्तविक प्रश्न के बजाए दूसरी तरफ "दूसरी बात यह है कि स्ट्रीमवाइटर परेशान होने पर परेशान हो रहा है विलय करें और एक विधि में निपटें? "। मुझे निश्चित रूप से पता नहीं है कि यह सही * है, लेकिन यह निश्चित रूप से प्रस्तुत उत्तरों में से * सबसे सही * है। – Pharap

1

the documentation के अनुसार, Close के मूल्य के साथ बस Dispose पर कॉल करता है।

  • इस विधि बंद ओवरराइड करता है।

  • बंद करने का यह कार्यान्वयन सही मान को पारित करने वाली विधि का निपटान करें।

  • आपको सुनिश्चित करने के लिए बंद करना होगा कि सभी डेटा अंतर्निहित धारा में सही ढंग से लिखे गए हैं। बंद करने के लिए कॉल के बाद, StreamWriter पर किसी भी ऑपरेशन अपवाद उठा सकता है। यदि डिस्क पर अपर्याप्त स्थान है, तो पर कॉल करना बंद अपवाद उठाएगा।

Dispose ही IDisposable, जो कक्षाओं संसाधनों जारी होने की आवश्यकता है कि द्वारा किया जाता है से विरासत में मिली है।

0

एक स्ट्रीम खोलना अनुप्रयोग और सिस्टम संसाधन दोनों आवंटित करता है। यदि आपका एप्लिकेशन उन्हें बंद किए बिना कई धाराएं खोलता है, तो यह उन फ़ाइलों तक पहुंचने के लिए अन्य अनुप्रयोगों की क्षमता को प्रतिबंधित करता है। यह महत्वपूर्ण है कि जितनी जल्दी हो सके स्ट्रीम बंद हो जाएं।

जहां तक ​​धाराओं को फिर से खोलने की क्षमता नहीं है, यह मूल रूप से .NET दृष्टिकोण है। कक्षा एक खुली धारा का प्रतिनिधित्व करती है। तो स्ट्रीम तक पहुंचने के लिए एक बनाएं और जितनी जल्दी हो सके इसे से छुटकारा पाएं। जब आप स्ट्रीम को फिर से एक्सेस करना चाहते हैं, तो आप एक और बनाते हैं।

मुझे लगता है कि यह एक स्ट्रीम क्लास बनाने के लिए मान्य होगा जिसे फिर से खोल दिया जा सकता है, लेकिन इससे कुछ समस्याएं होती हैं क्योंकि धारा बंद होने पर कई विधियां काम नहीं करतीं। अंत में, एक स्ट्रीम क्लास वास्तव में खुला स्ट्रीम का प्रतिनिधित्व करता है।

Dispose बस यह सुनिश्चित करना आसान बनाता है कि स्ट्रीम समय-समय पर साफ हो जाए।

-1

जब आप कहते हैं कि "क्यों न सिर्फ छुटकारा पाएं ..." पीछे की ओर छोड़कर आप सही रास्ते पर हैं। आप StreamWriter.Close() के लिए अंतर्निहित कोड को देखो, तो आप देखेंगे:

public override void Close() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize((object) this); 
} 

तो बंद() विधि अभी जिस तरह तुम रूपरेखा है कि आप धारा के लिए लिख किया जाता है बता होता है।

0

क्यों न सिर्फ निकट से छुटकारा पाएं और अंतर्निहित धारा को अपनी पहली क्रिया के रूप में बंद कर दें?

यह अच्छा प्रोग्रामिंग अभ्यास है।

मान लीजिए कि आपके घर में रोशनी है जो आप छोड़ते समय स्वचालित रूप से बंद हो जाती है। जब आप छोड़े गए रोशनी बंद करने के लिए नहीं है, लेकिन यह अभ्यास अच्छा है। इस तरह, आपको उस घर की आवश्यकता नहीं होगी जिसके लिए आप रहते हैं स्वचालित रूप से रोशनी बंद कर देते हैं। आप उन्हें खुद को बंद करने की आदत में होंगे।

स्पष्ट रूप से Close() कॉल करने वाले पाठक (और सिस्टम) को "मैं इस स्ट्रीम के साथ किया गया" बताता हूं, और Dispose() को सिस्टम (और पाठक) को कॉल करता है "आप किसी भी एम्बेडेड संसाधनों को छोड़ सकते हैं"।

+2

दोनों विधियों को कॉल करने की कोई आवश्यकता नहीं है। 'बंद करें' बस 'निपटान' कहता है। दोनों को कॉल करना सिर्फ अनावश्यक है, और किसी भी तरह से एक अच्छा अभ्यास नहीं है। – Servy