Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Вызвать Dispose у разных объектов

#c_sharp


Есть коллекция, которая содержит экземпляры объектов. Некоторые из них реализуют
интерфейс IDisposable. 

Вопрос, как в этой коллекции можно вызвать метод Dispose, у объектов, реализующих
интерфейс?

Пробую так, но не получается увидеть Dispose:

foreach (var actTab in ActTabs)
{
    if (actTab is IDisposable)
    {
       // Вызвать Dispose         
    }
}

    


Ответы

Ответ 1



Чтобы вызвать метод Dispose, нужно привести actTab к IDisposable Как один из вариантов решения: foreach (var actTab in ActTabs) { var disposableActTab = actTab as IDisposable; if (disposableActTab != null) { disposableActTab.Dispose(); } } Он же с использованием null propagation: foreach (var actTab in ActTabs) { var disposableActTab = actTab as IDisposable; disposableActTab?.Dispose(); } Если хочется оставить проверку с помощью is, то можно так: foreach (var actTab in ActTabs) { if (actTab is IDisposable) { ((IDisposable)actTab).Dispose(); } } или так: foreach (var actTab in ActTabs) { if (actTab is IDisposable) { (actTab as IDisposable).Dispose(); } } Начиная с C# 7.0 этот вариант можно записать короче с помощью Type pattern, как показано в ответе @trydex

Ответ 2



Вы все правильно делаете, только чтобы метод Dispose был доступен нужно вызывать его через приведение типов: foreach (var actTab in ActTabs) { if (actTab is IDisposable myObj) { myObj.Dispose(); } }

Ответ 3



Можно лаконично через LINQ вызвать: list.OfType().ToList().ForEach(x=>x.Dispose());

Комментариев нет:

Отправить комментарий