从这些简单的类开始......
假设我有一组简单的类,如下所示:
class Bus
{
Driver busDriver = new Driver();
}
class Driver
{
Shoe[] shoes = { new Shoe(), new Shoe() };
}
class Shoe
{
Shoelace lace = new Shoelace();
}
class Shoelace
{
bool tied = false;
}
ABus
有 a Driver
, theDriver
有两个Shoe
s,每个Shoe
都有 a Shoelace
。都非常傻。
将 IDisposable 对象添加到 Shoelace
后来我决定一些操作Shoelace
可以是多线程的,所以我添加了一个EventWaitHandle
用于线程通信的线程。所以Shoelace
现在看起来像这样:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
在鞋带上实现 IDisposable
但现在微软的 FxCop会抱怨:“在 'Shoelace' 上实现 IDisposable,因为它会创建以下 IDisposable 类型的成员:'EventWaitHandle'。”
好的,我实现IDisposable
了Shoelace
,我整洁的小班变成了可怕的一团糟:
class Shoelace : IDisposable
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Shoelace()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (waitHandle != null)
{
waitHandle.Close();
waitHandle = null;
}
}
// No unmanaged resources to release otherwise they'd go here.
}
disposed = true;
}
}
或者(正如评论者所指出的)因为Shoelace
它本身没有非托管资源,我可以使用更简单的 dispose 实现而不需要Dispose(bool)
and 析构函数:
class Shoelace : IDisposable
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
public void Dispose()
{
if (waitHandle != null)
{
waitHandle.Close();
waitHandle = null;
}
GC.SuppressFinalize(this);
}
}
惊恐地看着 IDisposable 传播
没错,就是这么固定的。但是现在 FxCop 会抱怨Shoe
创建了一个Shoelace
,所以也Shoe
必须IDisposable
如此。
并且Driver
创造必须Shoe
如此。并创造必须如此等等。Driver
IDisposable
Bus
Driver
Bus
IDisposable
突然间Shoelace
,我Bus
对Shoelace
.
问题
您如何防止IDisposable
.