我经常在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。
这样做有很多其他选择,但最终,我想不出任何会像这样整洁,所以去吧!
慕桂英3389331
TA贡献2036条经验 获得超8个赞
如果你只想要一些干净的范围代码,你也可以使用lambdas,ála
myFribble.SafeExecute(() =>
{
myFribble.DangerDanger();
myFribble.LiveOnTheEdge();
});
其中.SafeExecute(Action fribbleAction)方法包装try- catch- finally块。
- 3 回答
- 0 关注
- 442 浏览
添加回答
举报
0/150
提交
取消