我有以下方法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
因为(我相信)这将处置其唯一的非托管资源?
答案 0 :(得分:8)
最好的“经验法则”是:
如果某些内容实现IDisposable
,请始终将其包装在using()
块中,以确保其拥有的任何非托管资源都已正确处理。
依赖于当前实现“某事”处理底层资源这一事实是危险的,将所有内容包装在using
中只是为了安全起见 =)
答案 1 :(得分:4)
你是对的,你不必须处理读者。但是在给出的代码中,它也不会受到伤害。
我不会在LoadDocument()
中放置一个使用块,因为它的设计是为了“借用”它的流(它不会创建它)。
但是无论如何都有Dispose XmlReader的参数,因为它是IDisposable。我不认为这里有一个明显的赢家,因为Reader(和Writer)家族的设计有争议:他们在没有显然是这些流的所有者的情况下处理他们的baseStream。