我在 C + + 中经常使用的方法是让一个类 A
通过 A
构造函数和析构函数处理另一个类 B
的状态进入和退出条件,以确保如果该范围中的某个东西抛出异常,那么当该范围退出时,B 将拥有一个已知的状态。就首字母缩写而言,这并不是纯粹的 RAII,但它仍然是一种已确定的模式。
In C#, I often want to do
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();
}
}
如果我想保证 FiddleTheFrobble
返回时的 Frobble
状态
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
使用的是 with using
。我可以认为这是一个代码审查问题,但有些事情一直困扰着我。
问: 强 > 上述是否会被视为滥用 using
和 IDisposable
?