【发布时间】:2010-05-16 19:02:07
【问题描述】:
有时我需要在一个函数中使用多个一次性对象。最常见的情况是拥有 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 函数,以便该类更加灵活。 滥用这个函数肯定会导致对象没有被正确处理,但是如果没有这个类,还有很多其他的方法可以让你自己开枪。
【问题讨论】:
-
IMO - 在许多层面上都是个坏主意。我希望您在这里找到指导,为了您自己以及您可能与之合作的任何团队成员。请参阅 Skeet 的回答以了解清楚。
-
@Simon:别傻了。我们在这里一直有关于命名、大写和缩进的问题。相比之下,这个相当可观。
-
不确定我的概念是否有误,但不是为了这个目的,我们有来自 WinForms 时代的
System.ComponentModel.Container?使用简单的Container就可以了,这就像一个带有 Add 方法的集合。
标签: c# idisposable using