是否滥用IDisposable和“使用”作为获取异常安全的“范围行为”的手段?

我经常在C ++中使用的东西是让一个类通过构造函数和析构函数A处理另一个类的状态入口和退出条件,以确保如果该范围内的某些东西抛出异常,那么B将具有已知状态范围已退出。就首字母缩略词而言,这不是纯粹的RAII,但它仍然是一种既定的模式。BA


在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?


撒科打诨
浏览 422回答 3
3回答

交互式爱情

我不这么认为,必然。IDisposable的技术上是指用于事物具有非托管资源,但随后的使用指令是实现的一个常见的模式只是一种巧妙的方法try .. finally { dispose }。一个纯粹主义者会争辩说“是的 - 它是滥用的”,而在纯粹主义意义上它是; 但我们大多数人不是从纯粹的角度编码,而是从半艺术角度编码。在我看来,以这种方式使用“使用”结构确实非常具有艺术性。您可能应该在IDisposable上添加另一个接口以将其推得更远,向其他开发人员解释为什么该接口意味着IDisposable。这样做有很多其他选择,但最终,我想不出任何会像这样整洁,所以去吧!

慕桂英3389331

如果你只想要一些干净的范围代码,你也可以使用lambdas,álamyFribble.SafeExecute(() =>    {        myFribble.DangerDanger();        myFribble.LiveOnTheEdge();    });其中.SafeExecute(Action fribbleAction)方法包装try- catch- finally块。
打开App,查看更多内容
随时随地看视频慕课网APP