如果我处理XmlReader的基础流,我是否需要处理它本身?

7
我有以下方法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;
}

StreamReaderGetData释放。这意味着我不需要释放XmlReader吗?因为(我相信)这将释放它唯一的非托管资源?

2个回答

8

最好的工作准则是:

如果某个东西实现了IDisposable,那么一定要将它包装在using()块中,以确保它所拥有的任何非托管资源都被正确地释放。

依赖于"something"当前的实现已经处理了底层资源是危险的,把所有东西都包装在using中也不会有什么损失,只是为了更加安全 =)


2
啊,这是一个很好的观点。这可能是我需要时刻注意的一个概念。当一个例子出现在我的面前时总是很好的。 - Leonard Thieu
1
啊,这个答案只适用于C#。如果能够适用于C++/CLI就更好了。 - Just a HK developer

6
你是正确的,你不必处理读取器。但在给定的代码中,这样做也不会有事情发生。
我不会在LoadDocument()中放置using块,因为它被设计成“借用”流(而不是创建它)。
但仍然有理由释放XmlReader,只是因为它是IDisposable。我认为这里没有明显的胜者,因为读取器(和编写器)系列的设计存在争议:它们释放自己的基本流而不清楚地拥有这些流。

1
根据我的阅读,XmlReaderSettings 有一个名为 CloseInput 的属性,默认值为 true。我是否应该考虑禁用此默认行为,以便在不处理基础 Stream 的情况下处理 XmlReader - Leonard Thieu
1
我的书骗了我。CloseInput 的默认值是 false - Leonard Thieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接