IDisposable.Dispose()可以安全地多次调用吗?

Jak*_*les 41 .net c# idisposable

IDisposable的实现是否可以安全地多次调用Dispose()?或者相反?大多数.NET Framework类采用什么方法?

具体来说,System.Data.Linq.DataContext.Dispose()多次通话是否安全?

我问的原因是因为我想知道是否需要这种额外保护:

public override void Dispose(bool disposing)
{
    // Extra protection...
    if (this.obj != null)
    {
        this.obj.Dispose();
        this.obj = null;
    }

    // Versus simply...
    this.obj.Dispose();

    base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)

在处理类的IDisposable成员时,或者我是否应该在this.obj.Dispose()不关心之前调用它的情况下调用它.

Ada*_*son 57

你应该可以安全地多次调用它,尽管如果可以的话你可能应该避免它.

从MSDN页面上IDisposable.Dispose():

如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用.如果多次调用Dispose方法,则该对象不得抛出异常.


dth*_*rpe 6

是的,您的IDisposable.Dispose()实现应该容忍被多次调用.在第一次调用Dispose()之后,所有其他调用都可以立即返回.

我更喜欢你的代码示例的第一部分,在你去的时候处理和归零局部变量.

请注意,即使在代码中实现Dispose和null模式,也可能多次调用.Dispose().如果多个使用者持有对同一个一次性对象的引用,则该对象的Dispose可能会被多次调用,因为这些对象删除了对它的引用.