有时候我需要在一个函数内使用多个一次性对象。最常见的情况是使用StreamReader和StreamWriter,但有时更复杂。
嵌套的using语句很快就会增加,并且看起来很丑。 为了解决这个问题,我创建了一个小类,收集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
}
这种方法是否存在问题,可能会在未来造成问题? 我故意保留了HashSet继承的Remove函数,以使该类更加灵活。 当然,滥用此函数可能导致对象不能正确释放,但是还有许多其他方式可以让你自己踩到坑里,而不需要使用这个类。
System.ComponentModel.Container
吗?使用一个简单的Container
就可以了,它就像一个带有Add方法的集合。 - nawfal