Иногда мне нужно использовать несколько одноразовых объектов внутри функции. Наиболее распространенным случаем является StreamReader и StreamWriter, но иногда это даже больше, чем это.
Вложенные операторы быстро складываются и выглядят уродливыми. Чтобы исправить это, я создал небольшой класс, который собирает объекты IDisposable и удаляет их, когда он сам расположен.
public class MultiDispose : HashSet<IDisposable>, IDisposable
{
public MultiDispose(params IDisposable[] objectsToDispose)
{
foreach (IDisposable d in objectsToDispose)
{
this.Add(d);
}
}
public T Add<T>(T obj) where T : IDisposable
{
base.Add(obj);
return obj;
}
public void DisposeObject(IDisposable obj)
{
obj.Dispose();
base.Remove(obj);
}
#region IDisposable Members
public void Dispose()
{
foreach (IDisposable d in this)
{
d.Dispose();
}
}
#endregion
}
Итак, теперь мой код выглядит так:
using (MultiDispose md = new MultiDispose())
{
StreamReader rdr = md.Add(new StreamReader(args[0]));
StreamWriter wrt = md.Add(new StreamWriter(args[1]));
WhateverElseNeedsDisposing w = md.Add(new WhateverElseNeedsDisposing());
// code
}
Есть ли что-то не так с этим подходом, которые могут вызвать проблемы в будущем? Я оставил функцию Remove, унаследованную от HashSet, для того, чтобы класс был более гибким. Разумеется, злоупотребление этой функцией может привести к тому, что объекты не будут утилизированы должным образом, но тогда есть много других способов стрелять в ногу без этого класса.