c# - IDisposable.Dispose() 实现应该是幂等的吗?

标签 c# .net memory-management idempotent

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/

相关文章:

c# - 如何将具有值的新列添加到现有数据表?

c# - ASP.NET Core 声明是否旨在指定用户可以执行的操作

iphone - NSFileManager 泄漏

c# - 如何在 Asp.net MVC 中检测爬虫

c# - EF Core - 添加唯一索引

c# - ASP.NET WebHook 和 Web 服务之间的区别?

c - 如何从特定区域分配内存

objective-c - 重新分配给包含自动释放对象的指针是否不正确?

c# - 将两个字符串传递到存储过程并通过特定字符拆分它们以执行查询

c# - 使用现有部件重新设计控件模板