为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
撒科打诨 2019-08-31 16:10:50
我经常在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?
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

我不这么认为,必然。IDisposable的技术上是指用于事物具有非托管资源,但随后的使用指令是实现的一个常见的模式只是一种巧妙的方法try .. finally { dispose }。


一个纯粹主义者会争辩说“是的 - 它是滥用的”,而在纯粹主义意义上它是; 但我们大多数人不是从纯粹的角度编码,而是从半艺术角度编码。在我看来,以这种方式使用“使用”结构确实非常具有艺术性。


您可能应该在IDisposable上添加另一个接口以将其推得更远,向其他开发人员解释为什么该接口意味着IDisposable。


这样做有很多其他选择,但最终,我想不出任何会像这样整洁,所以去吧!


查看完整回答
反对 回复 2019-08-31
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

如果你只想要一些干净的范围代码,你也可以使用lambdas,ála


myFribble.SafeExecute(() =>

    {

        myFribble.DangerDanger();

        myFribble.LiveOnTheEdge();

    });

其中.SafeExecute(Action fribbleAction)方法包装try- catch- finally块。


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 418 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信