gpt4 book ai didi

c# - 使用 IDisposable 和 "using"作为获取 "scoped behavior"以实现异常安全的手段是否滥用?

转载 作者:IT王子 更新时间:2023-10-29 03:35:14 25 4
gpt4 key购买 nike

我在 C++ 中经常使用的东西是让一个类 A处理另一个类的状态进入和退出条件 B ,通过 A构造函数和析构函数,以确保如果该范围内的某些内容引发异常,则 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();
}
}

如果我想保证 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();
}
}

这就是我想要做的。现在现实迎头 catch ,因为我 想要使用 需要 FrobbleJanitor使用 using .我可以认为这是一个代码审查问题,但有些事情困扰着我。

问题:以上是否会被视为滥用 usingIDisposable ?

最佳答案

我不这么认为,必然。从技术上讲,IDisposable 旨在用于具有非托管资源的事物,但是 using 指令只是实现 try .. finally { dispose } 通用模式的一种巧妙方式。 .

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

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

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

关于c# - 使用 IDisposable 和 "using"作为获取 "scoped behavior"以实现异常安全的手段是否滥用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2101524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com