2010-08-18 2 views
7

У меня есть следующий метод GetData, который создает файл StreamReader из файла.Нужно ли мне утилизировать XmlReader, если я удаляю его базовый поток?

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) называет следующие:

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

    return xmldoc; 
} 

StreamReader размещан GetData. Означает ли это, что мне не нужно распоряжаться XmlReader, поскольку (я считаю) это избавит от единственного неуправляемого ресурса?

ответ

6

Лучшее «правило большого пальца» для работы, если что-то реализует IDisposable, всегда заверните его в блок using(), чтобы убедиться, что все неуправляемые ресурсы, которыми он владеет, утилизируются правильно. Опираясь на тот факт, что ток реализация «что-то» распоряжается нижележащего ресурса опасно, и это не повредит, чтобы обернуть everythig в using, просто быть на безопасной стороне =)

+2

Ах, это хороший момент. Это, вероятно, концепция, о которой я должен помнить. Всегда приятно, когда на моем лице появляется пример. –

+1

Ответ на вопрос только для C#. Было бы неплохо, если бы ответ можно было применить даже к C++/CLI. – user3454439

4

Вы правы, вы не должны распоряжаться читателем. Но в приведенном коде это тоже не повредит.

Я не ставил бы используемый блок внутри LoadDocument(), потому что он сконструирован так, что он «заимствует» его поток (он его не создает).

Но есть аргументы для Dispose XmlReader в любом случае, просто потому, что это IDisposable. Я не думаю, что есть явный победитель здесь из-за спорный дизайн чтения (и Writer) семьи: Они Утилизировать их baseStreams без явно является владельцем этих потоков.

+0

Основе из того, что я читал, 'XmlReaderSettings' имеет свойство' CloseInput', которое по умолчанию имеет значение 'true'. Должен ли я подумать об отключении этого поведения по умолчанию, чтобы я мог избавиться от 'XmlReader', не избавляясь от базового« потока »? –

+0

Моя книга лгала мне. Значение по умолчанию для 'CloseInput' равно' false'. –

 Смежные вопросы

  • Нет связанных вопросов^_^