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()ブロックでラップして、所有している管理されていないリソースが正しく破棄されるようにします。

「何か」の現在の実装が基礎となるリソースを破棄するという事実に依存することは危険であり、安全のusingためにすべてをで包むことは害にはなりません=)

于 2010-08-18T23:24:57.463 に答える
5

そうです、読者処分する必要はありません。しかし、与えられたコードでは、それも害はありません。

LoadDocument()ストリームを「借用」するように設計されているため、usingブロックを内部に配置しません(作成しません)。

しかし、IDisposableであるという理由だけで、とにかくXmlReaderを破棄するという議論があります。リーダー(およびライター)ファミリーの設計が議論の余地があるため、ここに明確な勝者はいないと思います。彼らは、それらのストリームの所有者であることが明確にならずに、baseStreamsを破棄します。

于 2010-08-18T22:58:28.887 に答える