Стандартная коллекция для IDisposable объектов - PullRequest
8 голосов
/ 20 июля 2009

У меня есть куча IDisposable объектов в таблице поиска (простой старый словарь <>, прямо сейчас), но чтобы упростить код и избежать ошибок, я ищу класс коллекции, который "владеет" предметы, которые он держит, и чтобы не изобретать велосипед - такой класс уже существует?

Спецификация должна быть такой: - Сборник должен быть одноразовым, и при его утилизации все содержащиеся в нем предметы также должны быть утилизированы. - Всякий раз, когда предмет удаляется, он Dispose() -й первый. - в идеале, коллекция должна быть общей с ограничением типа, обеспечивающим IDisposable -нессность содержащегося типа.

Я сомневаюсь, что такой класс существует, но я был приятно удивлен существованием ReadOnlyCollection и ObservableCollection до ...

По сути, я бы хотел эквивалент контейнеров C ++ STL, но затем для CLR; -).

Ответы [ 5 ]

2 голосов
/ 28 июня 2017

Вы ищете CompositeDisposable .

    using System.Reactive.Disposables;

    ...

    CompositeDisposable xs = new CompositeDisposable(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Dispose();
2 голосов
/ 20 июля 2009

Из того, что я знаю, существует только такая коллекция для IComponents - Контейнер реализует IContainer . Для универсального IDisposable я думаю, что у вас нет других вариантов, кроме как «заново изобрести колесо».

1 голос
/ 20 июля 2009

Помните, что ваша коллекция может быть не единственной, содержащей одноразовые предметы ... Что если другой объект (внешний по отношению к коллекции) ссылается на один из них? Если вы утилизируете его при удалении коллекции, что будет с объектом?

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

0 голосов
/ 15 октября 2017

Как насчет этого:

public class DisposableEnumerable<T> : IEnumerable<T>, IDisposable where T : IDisposable
{
    IEnumerable<T> Enumerable { get; }

    public DisposableEnumerable(IEnumerable<T> enumerable)
    {
        Enumerable = enumerable;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return Enumerable.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return Enumerable.GetEnumerator();
    }

    public void Dispose()
    {
        foreach(var disposable in Enumerable)
        {
            disposable.Dispose();
        }
    }
}
0 голосов
/ 20 июля 2009

Я понимаю, что вы спрашиваете, но насколько сложно создать собственный метод удаления, который удаляет элемент перед его удалением?

...