Что-то, что я часто использовал в С++, позволяло классу A
обрабатывать запись состояния и условие завершения для другого класса B
, через конструктор и деструктор A
, чтобы убедиться, что если что-то в этой области исключение, тогда B будет иметь известное состояние, когда область действия была удалена. Это не чисто RAII, насколько акроним идет, но тем не менее установленный шаблон.
В С# я часто хочу сделать
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
?