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;
}

StreamReader由 处置GetData。这是否意味着我不必处置,XmlReader因为(我相信)这将处置其唯一的非托管资源?

4

2 回答 2

8

最好的“经验法则”是:

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

依靠“某事”的当前实现处理底层资源的事实是危险的,将所有内容包装在 a 中不会有什么坏处using,只是为了安全起见=)

于 2010-08-18T23:24:57.463 回答
5

你是对的,你不必处置读者。但在给出的代码中,它也不会受到伤害。

我不会在里面放一个 using 块,LoadDocument()因为它被设计成“借用”它的流(它不会创建它)。

但是无论如何都存在 Dispose XmlReader 的论据,只是因为它是 IDisposable。我认为这里没有明显的赢家,因为 Reader(和 Writer)系列的设计存在争议:他们在没有明确成为这些流的所有者的情况下处理了他们的 baseStreams。

于 2010-08-18T22:58:28.887 回答