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