Иногда мне нужно использовать несколько одноразовых предметов внутри функции.Наиболее распространенный случай - использование 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, чтобы класс был более гибким.Конечно, неправильное использование этой функции может привести к неправильной утилизации предметов, но есть много других способов выстрелить себе в ногу без этого класса.