私が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
ますか?