可以多次配置相同的实例

时间:2016-04-21 08:47:48

标签: c# .net dispose idisposable visual-tree

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

例如:

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();
    }
}

谢谢!

2 个答案:

答案 0 :(得分:1)

  

如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用。如果多次调用Dispose方法,则该对象不得抛出异常。除了Dispose之外的实例方法可以在已经处理资源时抛出ObjectDisposedException。

Source

答案 1 :(得分:1)

MSDN说:

  

如果多次调用Dispose方法,则该对象不得抛出异常。除了Dispose之外的实例方法可以在已经处理资源时抛出ObjectDisposedException。

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