IDisposable.Dispose()实现应该是幂等的吗?Microsoft.NET框架提供了IDisposable接口,需要实现voidDispose()方法。其目的是启用手动或基于范围的释放IDisposable实现可能已分配的昂贵资源。示例包括数据库集合、流和句柄。我的问题是,如果Dispose()方法的实现是幂等的——当在同一个实例上多次调用时,该实例只能“处置”一次,后续调用不会抛出异常。在Java中,大多数具有相似行为的对象(再次以流和数据库连接为例)对于close()操作都是幂等的,这恰好是Dispose()方法的模拟。但是,我对.NET(尤其是Windows窗体)的个人经验表明,并非所有实现(它们都是.NET框架本身的一部分)都是幂等的,因此对这些实现的后续调用会抛出ObjectDisposedException。这真的让我对如何处理一次性对象的实现感到困惑。这种情况是否有一个共同的答案,还是取决于对象的特定上下文及其用法?Dispose()方法的实现是否应该是幂等的?是的,应该。没有人知道它会被调用多少次。来自在MSDN上实现Dispose方法:Dispose方法应该可以多次调用而不会引发异常。具有良好IDispose实现的IDispose将具有一个布尔字段标志,指示它是否已被处置,并且在后续调用中不执行任何操作(因为它已被处置)。是的,还要确保在释放对象后调用类时其他方法正确响应。publicvoidSomeMethod(){if(_disposed){thrownewObjectDisposedException();}else{//...}}来自MSDN:允许多次调用Dispose方法而不抛出异常。第一次调用后,该方法应该什么都不做。就个人而言-是的-我总是使Dispose()幂等。在给定应用程序中对象的通常生命周期中,它可能不是必需的-从创建到处置的生命周期可能是确定的并且是众所周知的。但是,同样,在某些应用程序中,它可能不那么清楚。例如,在装饰器场景中:我可能有一个一次性对象A,它由另一个一次性对象B装饰。我可能想显式处理A,但DisposeonB也可以处理它包装的实例(认为:流)。鉴于使Dispose幂等(即,如果已经处置,什么也不做)相对容易,这似乎很愚蠢。以上是C#学习教程:IDisposable.Dispose()的实现应该是幂等的吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
