이 간단한 수업으로 시작하십시오 ...
다음과 같은 간단한 클래스 세트가 있다고 가정 해 봅시다.
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;
}
A 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의 FxCop 은 다음과 같이 불평 할 것 입니다.
좋아, 내가 구현 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(bool)
and Destructor가 없어도 더 간단한 dispose 구현을 사용할 수 있습니다 .
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
하면서도 관리되지 않는 개체가 올바르게 처리되도록 하려면 어떻게해야 합니까?