2016-04-21 10 views
-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? 

Причина, почему я спрашиваю это:

Я создал некоторый механизм, который поиска в 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(); 
    } 
} 

Спасибо!

+4

IIRC руководящие принципы для IDisposable состояния, что несколько вызовов 'Dispose' не должны выбрасывать. Я посмотрю, смогу ли найти ссылку. – spender

+0

О, тианкс, это было бы хорошо! – BendEg

+1

Кстати, если вы не [делаете свои классы «запечатаны»] (http://stackoverflow.com/questions/11024336/why-does-sealed-affect-the-implementation-of-idisposable), тогда вы должны реализовать полный [основной шаблон размещения] (https://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx#basic_pattern) (так что 'Dispose' не прерывается, когда класс). – spender

ответ

1

Если метод Dispose объекта вызывается более одного раза, объект должен игнорировать все вызовы после первого. Объект не должен генерировать исключение, если его метод Dispose вызывается несколько раз. Методы экземпляра, отличные от Dispose, могут вызывать исключение ObjectDisposedException, когда ресурсы уже настроены.

Source

1

MSDN говорит:

Объект не должен бросить исключение, если его Dispose метод вызывается несколько раз. Методы экземпляра, отличные от Dispose, могут вызывать исключение ObjectDisposedException, когда ресурсы уже настроены.

Последняя часть также имеет важное значение: убедитесь, что установить disposed логический флаг, чтобы обеспечить ресурсы не используются после Dispose называется. Вы также можете использовать это для второго вызова Dispose, чтобы просто игнорировать его.