Является ли неправомерным использование 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

Ответы на вопрос(12)

Ваш ответ на вопрос