在C++中,我经常使用一种方法,即让一个类A
通过其构造函数和析构函数处理另一个类B
的状态进入和退出条件,以确保如果该范围内的某些内容抛出异常,则在退出范围时B将具有已知状态。尽管这不是RAII的纯粹意义上的含义,但它仍然是一种成熟的模式。
在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();
}
}
如果我想在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
和 using
。我可以将其视为代码审查问题,但有些事情让我感到不安。
问题:上述是否被认为是滥用using
和IDisposable
?