Microsoft.NET 框架提供了IDisposable
接口(interface),它需要实现void Dispose()
方法。其目的是启用手动或基于范围的释放 IDisposable
实现可能已分配的昂贵资源。示例包括数据库集合、流和句柄。
我的问题是,Dispose()
方法的实现是否应该是幂等的 - 当在同一个实例上多次调用时,该实例只被“处理”一次,随后的调用不要抛出异常。在 Java 中,大多数具有相似行为的对象(再次以流和数据库连接为例)的 close()
操作是幂等的,这恰好是 Dispose()
方法。
但是,我对 .NET(尤其是 Windows 窗体)的个人经验表明,并非所有实现(.NET 框架本身的一部分)都是幂等的,因此后续调用这些抛出一个 ObjectDisposedException
。这真的让我对如何处理一次性对象的实现感到困惑。场景是否有一个共同的答案,还是取决于对象的具体上下文及其用法?
最佳答案
should the implementation of the
Dispose()
method be idempotent
是的,应该的。不知道会调用多少次。
来自 Implementing a Dispose Method在 MSDN 上:
a Dispose method should be callable multiple times without throwing an exception.
具有良好IDispose
实现的对象将有一个 bool 字段标志,指示它是否已经被释放,并且在后续调用时不执行任何操作(因为它已经被释放)。
关于c# - IDisposable.Dispose() 实现应该是幂等的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8923853/