Shoud 可以多次处理同一实例

本文关键字:实例 处理 Shoud | 更新日期: 2024-11-07 04:04:37

是否可以多次调用同一IDisposable实例的.Dispose而不会引发异常?对此有定义吗?

例如:

public class Test : IDisposable
{
    public void Dispose()
    {
        // What ever
    }
}
var t = Test();
t.Dispose();
t.Dispose(); // Should this work in any case?

我问这个的原因:

我已经创建了一些机制,该机制在VisualTree中搜索从IDisposable继承的元素,但我不能确定这些元素之一之前是否被释放。

从窗口类中截取的一些代码

/// <summary>
/// Dispose
/// </summary>
public void DisposeAll()
{
    foreach (var obj in WPFVisualTreeHelper.FindChildren<IDisposable>(this))
    {
        if (!disposables.Contains(obj))
        {
            disposables.Add(obj);
        }
    }
    foreach (IDisposable disposable in disposables)
    {
        disposable.Dispose();
    }
}

谢谢!

Shoud 可以多次处理同一实例

如果多次调用对象的 Dispose 方法,则该对象必须忽略第一个调用之后的所有调用。如果多次调用对象的 Dispose 方法,则不得引发异常。当资源已释放时,Dispose 以外的实例方法可能会引发 ObjectDisposedException。

MSDN 说:

如果多次调用对象的 Dispose 方法,则不得引发异常。当资源已释放时,Dispose 以外的实例方法可能会引发 ObjectDisposedException。

最后一部分也很重要:确保设置disposed布尔标志,以确保在调用Dispose后不会使用资源。您也可以将其用于第二次调用以Dispose忽略它。