-1

是否可以在不引发异常的情况下多次调用.Dispose同一个实例?IDisposable对此有什么定义吗?

例如:

public class Test : IDisposable
{
    public void Dispose()
    {
        // What ever
    }
}

var t = Test();
t.Dispose();
t.Dispose(); // Should this work in any case?

我问这个的原因:

我创建了一些机制,它在VisualTreefor 元素中搜索,这些元素继承自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();
    }
}

谢谢!

4

2 回答 2

1

MSDN说:

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

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

于 2016-04-21T08:52:09.320 回答
1

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

资源

于 2016-04-21T08:51:37.543 回答