2010-08-18 16 views
7

Mam następującą metodę GetData, która tworzy StreamReader z pliku.Czy muszę pozbyć się XmlReadera, jeśli usunę jego strumień bazowy?

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) wywołuje następujące:

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

    return xmldoc; 
} 

StreamReader jest usytuowany przy GetData. Czy to oznacza, że ​​nie muszę się pozbywać XmlReader, ponieważ (jak sądzę) pozbędzie się to jedynego niezarządzanego zasobu?

Odpowiedz

6

Najlepszą "regułą" do pracy jest, jeśli coś implementuje IDisposable, zawsze należy ją opakować w blok using(), aby upewnić się, że wszelkie niezarządzane zasoby, które posiada, są usuwane poprawnie. Powołując się na fakt, że obecny realizacja „coś” zbywa zasobu bazowego jest niebezpieczne i nie zaszkodzi owinąć everythig w using, żeby być po bezpiecznej stronie =)

+2

Ahh, to jest dobra uwaga. Jest to prawdopodobnie koncepcja, o której muszę pamiętać. Zawsze miło, gdy przykład pojawia się na mojej twarzy. –

+1

Ah Odpowiedź jest dobra tylko dla C#. Byłoby miło, gdyby odpowiedź można było zastosować nawet do C++/CLI. – user3454439

4

Masz rację, nie musisz mieć do pozbyć się czytnika. Ale w podanym kodzie też nie zaszkodzi.

Nie wstawiłbym bloku użytego do LoadDocument(), ponieważ został zaprojektowany w taki sposób, że "pożycza" strumień (nie tworzy go).

Ale istnieją argumenty, aby zrezygnować z XmlReader tak czy inaczej, tylko dlatego, że jest IDisposable. Nie sądzę, aby tutaj był wyraźny zwycięzca z powodu spornego projektu rodziny Reader (i Writer): Usuwają swoje baseStreams bez wyraźnego bycia właścicielem tych strumieni.

+0

oparciu off z tego co przeczytałem, 'XmlReaderSettings' ma właściwość' CloseInput', która domyślnie przyjmuje wartość 'true'. Czy powinienem rozważyć wyłączenie tego domyślnego zachowania, abym mógł pozbyć się 'XmlReader' bez pozbycia się bazowego' Stream'? –

+0

Moja książka mnie okłamała. Wartością domyślną dla 'CloseInput' jest' false'. –

Powiązane problemy