I have a code block as follows and I\'m using 3 nested using
blocks.
I found that using try finally
blocks I can avoid this but if there a
In a single method where you don't need to process or change data; the option suggested by Jan Sommer would be my choice. However, in some circumstances the DisposableList is useful. Particularly, if you have many disposable fields that all need to be disposed of (in which case you cannot use using).
Requires you to remember to add the item to the list. (Although you could also say you have to remember to use using.) Aborts the disposal process if one of the disposes methods throws, leaving the remaining items un-disposed.
public class DisposableList : List, IDisposable
{
public void Dispose()
{
if (this.Count > 0)
{
List exceptions = new List();
foreach (var disposable in this)
{
try
{
disposable.Dispose();
}
catch (Exception e)
{
exceptions.Add(e);
}
}
base.Clear();
if (exceptions.Count > 0)
throw new AggregateException(exceptions);
}
}
public T Add(Func factory) where T : IDisposable
{
var item = factory();
base.Add(item);
return item;
}
}
Now catch any exceptions from the Dispose calls and will throw a new AggregateException after going through all the items. I've added a helper Add method that allows a simpler usage:
using (var disposables = new DisposableList())
{
var file = disposables.Add(() => File.Create("test"));
// ...
var memory = disposables.Add(() => new MemoryStream());
// ...
var cts = disposables.Add(() => new CancellationTokenSource());
// ...
}