You could write something like:
Lazy<StreamWriter> sw = new Lazy<StreamWriter>(() => new StreamWriter(@"d:\abc.txt"));
try
{
if (something)
{
sw.Value.WriteLine("Foo");
}
}
finally
{
if (sw.IsValueCreated)
{
sw.Value.Dispose();
}
}
using Lazy<T>
to encapsulate the StreamWriter
.
You could even encapsulate Lazy<T>
to "handle" IDisposable
:
public sealed class DisposableLazy<T> : Lazy<T>, IDisposable where T : IDisposable
{
public DisposableLazy(Func<T> valueFactory) : base(valueFactory)
{
}
// No unmanaged resources in this class, and it is sealed.
// No finalizer needed. See http://stackoverflow.com/a/3882819/613130
public void Dispose()
{
if (IsValueCreated)
{
Value.Dispose();
}
}
}
and then
using (DisposableLazy<StreamWriter> sw = new DisposableLazy<StreamWriter>(() => new StreamWriter(@"d:\abc.txt")))
{
if (something)
{
sw.Value.WriteLine("Foo");
}
}