От новичка до гуру: Курсы программирования на CyberDuff

Стандартная коллекция для IDisposable объектов

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

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

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

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


  • Прошло немного времени. Вы сделали IDisposableCollection? Я тоже мог бы это использовать. 27.10.2010
  • Нет; Я закончил тем, что обернул коллекцию и показал только (очень) несколько методов, которые мне действительно были нужны - добавить / получить / удалить - и некоторые дополнительные функции для конкретной вещи, над которой я работал (множество наблюдателей за файловой системой). 27.10.2010

Ответы:


1

Вы ищете CompositeDisposable.

    using System.Reactive.Disposables;

    ...

    CompositeDisposable xs = new CompositeDisposable(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Dispose();
28.06.2017
  • Не общий. Это не совсем идеально; но это тоже не большая проблема. 16.10.2017
  • Расширения Rx не являются частью .NET Framework. Хотя для многих это не проблема, было бы не очень хорошей идеей ссылаться на всю библиотеку только для одного тривиального класса. 16.10.2017
  • @arbiter прав, хотя, IMHO, нет особого смысла не использовать Rx. После того, как вы приняли решение сократить гигантские накладные расходы, связанные с использованием .net в проекте, никто не должен придраться к использованию полезных библиотек. 16.10.2017

  • 2

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

    20.07.2009
  • Спасибо, я изучу его (хотя это выглядит немного тяжелым - в API есть куча вещей, которые я бы не использовал - это может не иметь значения)! 20.07.2009
  • Container и System.ComponentModel кажутся слишком сложными и недостаточно гибкими для общего использования. Короче, я принимаю ваш ответ, что у меня нет другого выхода, кроме как изобретать велосипед. 24.07.2009

  • 3

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

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

    20.07.2009
  • В настоящее время я полностью контролирую как объекты, так и коллекцию - так что это гипотетическая ситуация. В любом слючае; именно так все работает с IDisposables, не так ли? Я имею в виду, что кто-то должен владеть ими (т.е. в конечном итоге избавиться от них), и в этом случае владелец владеет переменным количеством IDisposables, поэтому собрать коллекцию будет проще всего. 20.07.2009

  • 4

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

    20.07.2009
  • Совсем несложно, но было бы чище, если возможно, этого избежать. И это не просто Remove, верно - любой метод, который может перезаписать элемент, неявно заменяет существующий элемент, который также должен быть Dispose () 'd. Если ваша коллекция реализует несколько стандартных интерфейсов, может быть довольно много вариантов этих функций удаления / установки, что приведет к раздуванию кода. 20.07.2009

  • 5

    Как насчет чего-то вроде этого:

    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();
            }
        }
    }
    
    15.10.2017
  • Я думаю, что ленивое перечисление в качестве аргумента здесь, по крайней мере, сложно; важно знать, что объекты, которые вы передаете, действительно утилизированы. Конечно, если коллекция не будет изменена, это не имеет значения. 16.10.2017
  • Также: даже если этого не должно происходить, вы должны учитывать, что произойдет, если базовый Dispose() выдает ошибку. 16.10.2017
  • Новые материалы

    ИИ меняет этику в руководстве
    Связь искусственного интеллекта, лидерства и этики Сострадание, глубокое понимание чужих страданий в сочетании с желанием облегчить их, возвышается как неотъемлемая человеческая добродетель...

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..