Нужно ли мне утилизировать XmlReader, если я утилизирую его основной поток?

У меня есть следующий метод GetData , который создает StreamReader из файла.

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 , поскольку (я считаю) это будет распоряжаться его единственным неуправляемым ресурсом?

7
задан Leonard Thieu 18 August 2010 в 22:55
поделиться

2 ответа

Лучшее практическое правило для работы:

Если что-то реализует IDisposable , всегда помещайте его в , используя () block, чтобы гарантировать правильное удаление любых неуправляемых ресурсов, которыми он владеет.

Полагаться на тот факт, что текущая реализация «чего-то» избавляется от базового ресурса, опасна, и не помешает обернуть все в , используя , просто чтобы на всякий случай =)

8
ответ дан 6 December 2019 в 21:08
поделиться

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

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

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

4
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: