У меня есть следующий метод 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
, поскольку (я считаю) это будет распоряжаться его единственным неуправляемым ресурсом?
Лучшее практическое правило для работы:
Если что-то реализует IDisposable
, всегда помещайте его в , используя ()
block, чтобы гарантировать правильное удаление любых неуправляемых ресурсов, которыми он владеет.
Полагаться на тот факт, что текущая реализация «чего-то» избавляется от базового ресурса, опасна, и не помешает обернуть все в , используя
, просто чтобы на всякий случай =)
Вы правы, вам не нужно утилизировать считыватель. Но в приведенном коде это тоже не помешает.
Я бы не стал помещать блок using внутрь LoadDocument()
, потому что он разработан так, что "заимствует" свой поток (не создает его).
Но есть аргументы в пользу утилизации XmlReader в любом случае, просто потому что он IDisposable. Я не думаю, что здесь есть однозначный победитель из-за спорного дизайна семейства Reader (и Writer): Они утилизируют свои базовые потоки (baseStreams), не будучи явным владельцем этих потоков.