이 간단한 수업으로 시작하십시오 ...
다음과 같은 간단한 클래스 세트가 있다고 가정 해 봅시다.
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하면서도 관리되지 않는 개체가 올바르게 처리되도록 하려면 어떻게해야 합니까?