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

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

Ответы [ 2 ]

8 голосов
/ 19 августа 2010

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

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

Опираясь на тот факт, что текущая реализация "1009" * "чего-то" избавляется от базового ресурса, это опасно, и не повредит, что все обернуто в using просто на всякий случай =)

4 голосов
/ 19 августа 2010

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

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

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

.
...