내가 C ++에서 자주 사용했던 것은 생성자와 소멸자 를 통해 A
클래스가 다른 클래스에 대한 상태 진입 및 종료 조건을 처리 하도록하여 해당 범위의 무언가가 예외를 던지면 B가 알려진 상태를 가질 수 있도록하는 것입니다. 범위가 종료되었습니다. 이것은 약어가가는 한 순수한 RAII는 아니지만 그럼에도 불구하고 확립 된 패턴입니다.B
A
C #에서는 종종
class FrobbleManager
{
...
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
this.Frobble.Lock();
}
}
이렇게해야하는
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
try
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
}
finally
{
this.Frobble.Lock();
}
}
반품 Frobble
시 상태 를 보증하고 싶다면 FiddleTheFrobble
. 코드는 더 좋을 것입니다.
private void FiddleTheFrobble()
{
using (var janitor = new FrobbleJanitor(this.Frobble))
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
}
}
여기서 FrobbleJanitor
보이는 대략 좋아
class FrobbleJanitor : IDisposable
{
private Frobble frobble;
public FrobbleJanitor(Frobble frobble)
{
this.frobble = frobble;
this.frobble.Unlock();
}
public void Dispose()
{
this.frobble.Lock();
}
}
그리고 그것이 제가하고 싶은 방법입니다. 내가 무엇 때문에 지금 현실은, 잡는다 원하는 사용하는 것은 필요로 그를FrobbleJanitor
사용 하여 using
. 나는 이것을 코드 검토 문제라고 생각할 수 있지만 무언가가 나를 괴롭힌다.
질문 : 위의 내용이 using
및의 남용으로 간주 IDisposable
됩니까?