Ваш код допускает возможность того, что выброшенное исключение заставит выполнение пропустить оператор, закрывающий ваш StringWriter
.Вы хотите убедиться, что перед тем как исключение вызовет выполнение ToCSV
, вы закроете sw
.
Самый простой способ справиться с этим - с помощью блока using
.Объект, созданный в предложении using
, гарантированно будет удален до выхода из области действия блока:
public string ToCsv()
{
IEnumerable<string> props = GetProperties();
using (StringWriter sw = new StringWriter())
{
sw.WriteLine(GetHeadings(props));
WriteValues(props, sw);
return sw.ToString();
}
}
Обратите внимание, что вам не нужно вызывать оба Close
и Dispose
дляStringWriter.Достаточно просто Dispose
.
В общем, вы захотите обернуть блок using
вокруг создания и использования всех объектов, которые реализуют IDisposable
(как это делает StringWriter
).Это гарантирует, что независимо от того, какие исключения будут выброшены, объект всегда удаляется должным образом.