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