Является ли неправомерным использование IDisposable и «использование» в качестве средства для получения «ограниченного поведения» для обеспечения безопасности исключений?
То, что я часто использовал в 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