首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDisposable.Dispose()实现应该是幂等的吗?

IDisposable.Dispose()实现应该是幂等的吗?
EN

Stack Overflow用户
提问于 2012-01-19 09:42:43
回答 4查看 1.2K关注 0票数 23

Microsoft.NET框架提供了需要实现void Dispose()方法的IDisposable接口。其目的是启用IDisposable实现可能已分配的昂贵资源的手动或基于范围的发布。示例包括数据库集合、流和句柄。

我的问题是,如果Dispose()方法的实现是幂等的--当在同一个实例上多次调用时,该实例只被“释放”一次,然后调用不抛出异常。在Java中,大多数具有类似行为的对象(在我看来同样是流和数据库连接)对于它们的close()操作都是幂等的,这恰好是Dispose()方法的模拟。

然而,我个人使用.NET (特别是Windows )的经验表明,并不是所有的实现(是.NET框架本身的一部分)都是幂等的,因此对这些实现的后续调用会抛出一个ObjectDisposedException。这确实让我对如何处理一次性对象的实现感到困惑。对于这个场景是否有一个共同的答案,还是取决于对象的具体上下文及其用法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-19 09:45:22

Dispose()方法的实现是否是幂等的

是的,应该的。不知道它会被调用多少次。

来自MSDN上的实现一个Dispose方法

应多次调用Dispose方法,而不引发异常。

一个具有IDispose良好实现的对象将有一个布尔字段标志,指示它是否已经被释放,以及在随后的调用中什么都不做(因为它已经被释放了)。

票数 20
EN

Stack Overflow用户

发布于 2012-01-19 09:48:27

是的,还请确保类的其他方法在对象已被释放时被调用时正确响应。

代码语言:javascript
复制
public void SomeMethod()
{
     if(_disposed)
     {
         throw new ObjectDisposedException();
     }
     else
     {
         // ...
     }

}
票数 7
EN

Stack Overflow用户

发布于 2012-01-19 09:46:12

来自MSDN:

允许多次调用Dispose方法,而不引发异常。在第一次调用之后,该方法不应该执行任何操作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8923853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档