2012-03-01 26 views
7

में कोड ब्लॉक लिखने के लिए (IDISposable obj = new ...) का उपयोग करके मैंने उपयोग कथन के साथ धाराओं में ब्लॉक लिखने के लिए IDISposable लागू करने वाले वर्गों का उपयोग करना शुरू कर दिया है। यह सही घोंसले रखने और लापता या गलत तरीके से शुरू/अंत भागों से बचने में मददगार है।स्ट्रीम में कोड ब्लॉक (उदा। एक्सएमएल)

असल में, कन्स्ट्रक्टर एक ब्लॉक (जैसे एक्सएमएल टैग खोलना) की शुरुआत लिखता है, अंत (उदा। एक्सएमएल टैग बंद करें)। उदाहरण नीचे UsableXmlElement है (यह बड़े एक्सएमएल के लिए है, इसलिए स्मृति में LINQ से XML या XmlDocument में कोई विकल्प नहीं है)।

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

क्या इसके लिए कोई नीचे की ओर है, या यह तत्वों के सही घोंसले को बनाए रखने का एक अच्छा तरीका है?

class UsableXmlElement : IDisposable 
{ 
    private XmlWriter _xwriter; 

    public UsableXmlElement(string name, XmlWriter xmlWriter) 
    { 
     _xwriter = xmlWriter; 
     _xwriter.WriteStartElement(name); 
    } 

    public void WriteAttribute<T>(string name, T value) 
    { 
     _xwriter.WriteStartAttribute(name); 
     _xwriter.WriteValue(value); 
     _xwriter.WriteEndAttribute(); 
    } 

    public void WriteValue<T>(T value) 
    { 
     _xwriter.WriteValue(value); 
    } 

    public void Dispose() 
    { 
     _xwriter.WriteEndElement(); 
    } 
} 

प्रयोग इस तरह है:

<RootElement DocVersion="123"> 
    <InnerElement> 
     <!-- anything --> 
    </InnerElement> 
</RootElement> 
+2

यह समस्या क्यों होनी चाहिए? आप अपने UsableXmlElement में किसी भी अप्रबंधित संसाधनों को प्राप्त नहीं करते हैं, इसलिए आपको किसी भी अंतिमकर्ता की आवश्यकता नहीं है, मुझे लगता है ... – user1096188

+0

ओह, और आपको जेनेरिक होने के लिए WriteValue और WriteAttribute की आवश्यकता नहीं है। यह कुछ भी नहीं करता है, _xwriter.WriteValue हमेशा ऑब्जेक्ट पैरामीटर के साथ बुलाया जाएगा। – user1096188

+0

हममम्म ........ – code4life

उत्तर

2

वहाँ इस के लिए किसी भी नीचे की ओर है,

सं Destructors (finalizers:

var xWriter = new XmlWriter(...) 

using(var rootElement = new UsableXmlElement("RootElement", xWriter) 
{ 
    rootElement.WriteAttribute("DocVersion", 123) 
    using(var innerElement = new UsableXmlElement("InnerElement", xwriter) 
    { 
     // write anything inside Inner element 
    } 
} 

में परिणामी) किसी भी से बचा जाना चाहिए ए, यहां तक ​​कि संसाधनों वाला एक वर्ग आमतौर पर बिना (बेहतर) कर सकता है।

या यह तत्वों का सही घोंसला बनाए रखने का एक अच्छा तरीका है?

हां। आप संदर्भ के रूप में System.Web.Mvc.Html.MvcForm का उपयोग कर सकते हैं।

इन IDisposable प्रतिरूप को माइक्रोसॉफ्ट

द्वारा सिफारिश को लागू नहीं करते 'पूर्ण' पैटर्न सही लेकिन दिनांकित है। यह केवल 'बेयर' अप्रबंधित संसाधन की स्थिति का वर्णन करता है। केवल प्रबंधित संसाधनों से निपटने के लिए एक आधिकारिक संदर्भ केवल अनौपचारिक रूप से उपलब्ध नहीं कराए जाते हैं।

3

मुख्य नकारात्मक पक्ष जो मैं देखता हूं (उपयोग करने वाले कथन के गैर-मानक उपयोग के अलावा तर्कसंगत रूप से "कम से कम आश्चर्य के सिद्धांत" का उल्लंघन करना) यह है कि यह अपवाद की स्थिति में सभी नेस्टेड एंड टैग को बार-बार लिखने का प्रयास करेगा आपके XmlWriter द्वारा फेंक दिया गया।

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

+0

इसे कभी भी "कम से कम आश्चर्य के सिद्धांत" के रूप में संदर्भित नहीं किया गया। मैं भविष्य में उस अभिव्यक्ति का उपयोग करूँगा :) –

1

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

आप अपनी कक्षाओं में किसी भी अप्रबंधित संसाधनों का उपयोग नहीं करते हैं। आप अपने कोड को अधिक पठनीय और रखरखाव करने के लिए बस सी # के using कीवर्ड का लाभ उठाते हैं। मुझे लगता है कि यह एक अच्छा दृष्टिकोण है और मैंने इसे पहले भी इस्तेमाल किया है।

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

सबसे बुरी स्थिति में, जब अंतिमकर्ता निपटान() को कॉल करता है, तो XmlWriter पहले से ही निपटान किया जा सकता है और आपको अपवाद मिलता है। तो कोई फाइनलाइज़र बेहतर नहीं है।