2010-02-06 9 views
6

... यदि मैं स्थानीय चर में एक आईडीस्पोजेबल का उपयोग करता हूं, लेकिन निपटान() को कॉल न करें या उपयोग() पैटर्न का उपयोग न करें।स्थानीय इस्तेमाल किए गए IDISposable के लिए कोई FxCop नियम है?

public void BadMethod() 
{ 
    var fs = new FileStream("file.txt", FileMode.Create); 
    fs.WriteByte(0x55); 
    // no dispose, no using() 
} 

फ़ील्ड के लिए "Types that own disposable fields should be disposable" नियम की तरह।


संपादित करें: FileStream द्वारा बदला MemoryStream, क्योंकि MemoryStream सिर्फ स्मृति आवंटित करता है और उपयोग नहीं करता है (अप्रबंधित) संसाधन है, तो किसी को एक अनिवार्य निपटान() कॉल के बारे में चर्चा कर सकते हैं।

+1

आप ऐसा क्यों चाहते हैं? यह व्यर्थ है, स्मृति डिस्पोजेबल नहीं है। उम्मीद है कि हमें ऐसा टूल नहीं मिलेगा जो कहता है, यह प्रोग्रामर दिमाग को अपरिवर्तनीय रूप से नष्ट कर देगा। –

+8

@nobugz: वास्तव में मेमोरीस्ट्रीम पर निपटने के लिए वास्तव में यहां उचित है। तथ्य यह है कि मेमोरीस्ट्रीम किसी भी अप्रबंधित संसाधनों का उपयोग नहीं करता है * एक कार्यान्वयन * विवरण है। मेमोरीस्ट्रीम के लिए ** कॉन्ट्रैक्ट ** कहता है कि यह आईडीस्पोज़ेबल लागू करता है, और इस तरह, इसे हमेशा निपटान करना चाहिए। विशिष्ट कार्यान्वयन विवरण के मुकाबले अनुबंध के खिलाफ कोड हमेशा * बेहतर होता है। – casperOne

+0

@ कैप्सर: हाँ, कुछ प्रोग्रामर मशीन की तरह उन्हें बताने के लिए कि क्या करना है। यह एक धर्म है जिसका मैं सब्सक्राइब नहीं करता हूं, मैं जानबूझकर नियम को तोड़ना पसंद करता हूं। आगे बढ़ें और इसे अपना रास्ता दें, आप कभी गलत साबित नहीं होंगे। केवल सुस्त –

उत्तर

15

क्या इसके लिए कोई FxCop नियम है? हां और ना।

FxCop 1.35 में, जो विजुअल स्टूडियो 2005 कोड विश्लेषण पर आधारित है, वहां एक नियम DisposeObjectsBeforeLosingScope था जो वास्तव में ऐसा करता था।

FxCop 1.36 (विजुअल स्टूडियो 2008 कोड विश्लेषण) में, उन्होंने अपने डेटा प्रवाह विश्लेषण इंजन को हटा दिया, जिसका अर्थ था कि इस नियम को भी हटा देना था।

हालांकि, अगले FxCop (विजुअल स्टूडियो 2010 कोड विश्लेषण) में, ऐसा लगता है कि DisposeObjectsBeforeLosingScope वापस आ गया है!

+0

+1। यह नहीं पता था कि यह 2010 में जोड़ा गया है। जबकि मैं नियम के साथ जरूरी नहीं हूं, यह सवाल का सीधा जवाब है। –

+0

बीटीडब्लू: आपके दूसरे लिंक पर: "एक डिस्पोजेबल ऑब्जेक्ट को लौटने के लिए क्या आवश्यक है कि ऑब्जेक्ट को एक प्रयोग में बनाया गया है/आखिर में एक ब्लॉक के बाहर ब्लॉक करें" मतलब ?? – ulrichb

+1

वे वास्तव में उस आलेख में नमूने में इसे कवर करते हैं। 'ओपनपोर्ट 2' विधि को देखें। असल में, यदि ऑब्जेक्ट बनाया गया है लेकिन प्रारंभ करने में विफल रहता है, तो उपयोगकर्ता को अपवाद फेंकने से पहले इसे 'निपटान() '' डी 'होना चाहिए (अन्यथा यह दायरे से बाहर हो जाता है)। एक 'उपयोग' यहां उचित नहीं होगा क्योंकि * कॉलर * को बाद में 'निपटान() 'कॉल करने की उम्मीद है। – bobbymcr

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