2010-08-18 9 views
7

Ich habe die folgende Methode GetData, die eine StreamReader aus einer Datei erstellt.Muss ich XmlReader entsorgen, wenn ich den zugrunde liegenden Stream entsorge?

private void GetData(string file) 
{ 
    string filename = Path.GetFileNameWithoutExtension(file); 
    XmlDocument xmldoc = new XmlDocument(); 

    using (StreamReader sr = new StreamReader(file)) 
    { 
     Stream bs = sr.BaseStream; 
     Stream cl = mainParser.CleanMarkup(bs); 
     try 
     { 
      xmldoc = mainParser.LoadDocument(bs); 
     } 
     catch (XmlException ex) 
     { 
      // Exceptions are usually caused by non-compliant documents. 
      // These errors are not critical to the operation of this program. 
      Console.WriteLine(filename + " " + ex.Message); 
     } 
    } 
    Msdn msdnParser = new Msdn(xmldoc); 

    ListViewItem lvitem = new ListViewItem(filename); 
    lvitem.SubItems.Add(filename); 
    foreach (string item in msdnParser.Subitems) 
    { 
     lvitem.SubItems.Add(item); 
    } 
    listView.Items.Add(lvitem); 
} 

mainParser.LoadDocument(bs) ruft folgende:

public XmlDocument LoadDocument(Stream file) 
{ 
    XmlDocument xmldoc = new XmlDocument(); 
    XmlReader xmlread = XmlReader.Create(file); 
    xmldoc.Load(xmlread); 

    return xmldoc; 
} 

StreamReader durch GetData angeordnet ist. Bedeutet dies, dass ich XmlReader nicht entsorgen muss, da (glaube ich) dies über seine einzige nicht verwaltete Ressource verfügen würde?

Antwort

6

Die beste "Faustregel" zu arbeiten ist, wenn etwas implementiert IDisposable, wickeln Sie es immer in einen using() Block, um sicherzustellen, dass alle nicht verwalteten Ressourcen, die es gehört, ordnungsgemäß entsorgt werden. Unter Berufung auf der Tatsache, dass die aktuelle Umsetzung von „etwas“ verfügt über eine zugrunde liegende Ressource ist gefährlich, und es wird nicht wickeln everythig in einem using verletzt, nur um auf der sicheren Seite =)

+2

Ahh, das ist ein guter Punkt. Dies ist wahrscheinlich ein Konzept, das ich beachten muss. Immer schön wenn ein Beispiel in meinem Gesicht auftaucht. –

+1

Ah die Antwort ist nur für C# gut. Es wäre schön, wenn die Antwort auch auf C++/CLI angewendet werden könnte. – user3454439

4

Sie haben Recht, haben Sie nicht müssen den Leser entsorgen. Aber in dem gegebenen Code würde es auch nicht weh tun.

Ich würde keinen Verwendungsblock innerhalb LoadDocument() setzen, weil es so entworfen ist, dass es seinen Strom 'leiht' (es schafft es nicht).

Aber es gibt Argumente, den XmlReader sowieso zu disponieren, nur weil es IDisposable ist. Ich glaube nicht, dass es hier einen eindeutigen Gewinner gibt, wegen des strittigen Designs der Reader (und Writer) -Familie: Sie entsorgen ihre baseStreams, ohne eindeutig der Besitzer dieser Streams zu sein.

+0

Basierend off von dem, was ich gelesen habe, 'XmlReaderSettings' hat eine Eigenschaft' CloseInput', die standardmäßig auf 'true' steht. Sollte ich in Erwägung ziehen, dieses Standardverhalten zu deaktivieren, damit ich 'XmlReader' entsorgen kann, ohne den zugrunde liegenden' Stream' zu entsorgen? –

+0

Mein Buch hat mich angelogen. Der Standardwert für 'CloseInput' ist' false'. –

Verwandte Themen