从这些简单的类开始...
假设我有一组简单的类,如下所示:
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;
}
一个Bus
有一个Driver
,Driver
有两个Shoe
,每个Shoe
有一个Shoelace
。这一切都很愚蠢。
将IDisposable对象添加到鞋带
后来,我决定Shoelace
上的一些操作可以是多线程的,所以我为线程添加了一个EventWaitHandle
来与之通信。所以Shoelace
现在看起来是这样的:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
在鞋带上实现IDisposable
但现在Microsoft's FxCop会抱怨:“在‘鞋带’上实现IDisposable,因为它创建了以下IDisposable类型的成员:‘EventWaitHandle’。”
好吧,我在Shoelace
上实现了IDisposable
,我的小类变得很糟糕:
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)
和析构函数:
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
的这种传播,同时仍然确保您的非托管对象被正确处理?
https://stackoverflow.com/questions/661815
复制相似问题