2011-12-01 19 views
6

तो कोड विश्लेषण कह रहा है कि Enumarble.Where(this ...)WhereListIterator<T> का एक उदाहरण है, जो है (होना करने के लिए लग रहा है) नेट रूपरेखा है कि IDisposable लागू करता है के भीतर एक आंतरिक प्रकार लौटा रहा है ।Coverity, Enumerable.Where (इस ...), और IDisposable

कवरेज को IDisposable को अनचाहे जाने के लिए पसंद नहीं है, और इसलिए यह सुझाव दिया गया है कि मैं उस उदाहरण का निपटान करता हूं। स्पष्ट रूप से मैं कुछ प्रकार की जांच किए बिना उदाहरण का निपटान नहीं कर सकता, क्योंकि Enumerable.Where(this ...)IEnumerable<T> लौटने के लिए कहा जाता है, जो IDisposable से ihnerit नहीं है।

मेरा प्रश्न यह है: क्या .NET मुझे WhereListIterator<T> का निपटान करने की उम्मीद करता है, या पुनरावृत्तकर्ता स्वयं को निपटाने का प्रयास करता है (कहें, प्रत्येक गणना के बाद)। अगर मुझे इसका निपटान करने की उम्मीद नहीं है, तो इंटरफेस क्यों लागू किया गया है? यह मुझे तीसरे, थोड़ा असंबंधित प्रश्न की ओर ले जाता है: यदि IDisposable स्पष्ट रूप से कार्यान्वित किया गया था, तो क्या कवरेज (कोड विश्लेषण) अभी भी सोचता है कि मुझे इसका निपटान करना चाहिए?

कोड उदाहरण:

var myList = new List<int>{ 1, 2, 3, 4 }; 

var evenNumbers = myList.Where(x => x % 2 == 0); 

foreach(var number in evenNumbers) 
{ 
    Console.WriteLine(number); 
} 

if(evenNumbers is IDisposable) 
{ 
    ((IDisposable)evenNumbers).Dispose(); // This line will be executed 
} 
+12

foreach पाश स्वचालित रूप से आपकी ओर से निपटान कॉल पर फोन करना चाहिए; यदि एक कोड विश्लेषण उपकरण उस तथ्य को नहीं जानता है तो आपको शायद अधिक सटीक कोड विश्लेषण टूल का उपयोग करना चाहिए। आप इसे टूल के रखरखावकर्ताओं को बग के रूप में रिपोर्ट करने पर विचार कर सकते हैं। –

+0

यह मेरा विचार बिल्कुल सही था, लेकिन इसके बारे में जिद्दी होने के बजाय, मुझे लगा कि मुझे समुदाय से पूछना चाहिए। –

+1

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

उत्तर

12

नहीं, आप इसके बारे में अपने आप को निपटाने के लिए जरूरत नहीं है। ध्यान दें कि आप LINQ के लिए किसी भी आवश्यकता के बिना इस तरह की चीज का प्रदर्शन कर सकते हैं। इस मामले में मेरा मानना ​​है कि WhereListIterator<T> वास्तव में एक हाथ से लिखा वर्ग है, लेकिन एक iterator ब्लॉक कुछ इसी तरह दिखाता है: क्योंकि यह न सिर्फ IEnumerable<T> लेकिन यह भी IEnumerator<T> एक अनुकूलन के रूप में लागू करता

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var empty = Empty(); 
     Console.WriteLine(empty is IDisposable); // Prints True 
    } 

    static IEnumerable<string> Empty() 
    { 
     yield break; 
    } 
} 

यह वास्तव में IDisposable लागू करता है - के रूप में कार्य करता है iterable इटेटरेटर भी, सामान्य मामले में जहां आप केवल एक बार फिर से सक्रिय करते हैं। foreach लूप पूरी तरह से IEnumerator<T> का निपटान करेगा, और को की आवश्यकता नहीं है जब तक कि आप इसे फिर से चालू न करें।

असल में, आप यहां ठीक हैं - हालांकि यह दयालु है कि कवरिटी आपको इसके बारे में चेतावनी दे रही है। (मैंने खुद को कवरेज का उपयोग नहीं किया है, ईमानदार होने के लिए - मुझे नहीं पता कि आप यहां अपने व्यवहार को ट्विक करने के लिए कुछ कर सकते हैं।)

5

यदि आप फ़ोरैच लूप का उपयोग नहीं कर रहे हैं और फिर से पुराने तरीके का उपयोग नहीं कर रहे हैं

var v = new List<int>() { 1,2,3}; 
var enumerator = v.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 

    Console.WriteLine(enumerator.Current); 
} 

तो आप निपटान विधि

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

  • कोई संबंधित समस्या नहीं^_^