繁体   English   中英

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

[英]Do I need to Dispose XmlReader if I Dispose its underlying Stream?

我有以下方法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因为(我相信)这会处置它唯一的非托管资源?

最好的“经验法则”是:

如果某些东西实现了IDisposable ,请始终将其包装在using()块中,以确保它所拥有的任何非托管资源都被正确处理掉。

依赖于“某事物”的当前实现处理底层资源这一事实是危险的,将所有内容包装在一个using也不会有害,只是为了安全起见 =)

你说得对,你没有处分读者。 但是在给出的代码中,它也不会受到伤害。

我不会在LoadDocument()放置一个使用块,因为它的设计是为了“借用”它的流(它不会创建它)。

但是无论如何都有Dispose XmlReader的参数,因为它是IDisposable。 我不认为这里有一个明显的赢家,因为Reader(和Writer)家族的争议设计:他们处理他们的baseStreams而没有显然是这些流的所有者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM