NotifyCollectionChangedAction: экземпляр объекта при удалении?

В настоящее время я реализую интерфейс INotifyCollectionChanged для коллекции, как правило, с довольно важными и недолговечными элементами. Все эти элементы реализуют IDispose, который можно вызвать непосредственно перед удалением из коллекции. У меня нет никакого контроля над порядком уничтожения, я просто должен принять его, как он есть.

Моя проблема сейчас в том, как распространять действия "Убрать". Конструктор NotifyCollectionChangedAction предоставляет вариант только с указанным действием, но у меня есть индекс удаленного элемента. К сожалению, нет перегрузки, принимая только индекс.

Так что я думаю, я мог бы:

  • Пройдите только действие "Удалить"
  • Передайте действие удаления вместе с нулевым объектом и индексом
  • Передайте действие удаления вместе с удаленным объектом и индексом

Какой из них вы бы предпочли? Я немного боюсь неправильной реализации такого "основного" интерфейса и, возможно, вызываю явно не связанные ошибки...

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

Примечание: коллекция не будет немедленно связана с WPF, если это важно.

2 ответа

Решение

Из того, что я вижу в MSDN, единственные подходящие наборы данных для удаления - это перегрузка, берущая экземпляр, и перегрузка, берущая экземпляр и индекс. Вы можете попробовать последнее, передав только индекс; это может сработать... но учитывая наличие первой перегрузки, я не надеюсь. Если вы не дадите ему объект, нижестоящий код может не знать, какой элемент изменился. Поэтому я думаю, что вам придется передать объект. Это обычно не должно вызывать проблем, так как большая часть кода просто использует его для проверки ссылок; объект все еще там (он не был собран) - он был только что удален, где "просто" используется... субъективно (поскольку это все еще может вызывать проблемы).

Другой вариант, конечно, это обернуть объект в фасад. Тогда не имеет значения, удален ли фактический объект, установлен ли он в ноль и / или собран ли мусор; фасад все еще там (но он должен быть закодирован для обработки недоступного объекта).

В качестве окончательного варианта; Вы должны использовать их коллекцию? Не могли бы вы просто обернуть эту коллекцию, чтобы выбрать, когда рассказать об этих вещах? Тогда вы сохраняете полный контроль над жизнями...

В основном вы обмануты.

  • Уничтожение объектов перед удалением является нарушением того, как должен работать интерфейс. Точка. Вы не можете управлять им - тогда вы не можете правильно реализовать NotifyCollectionChangedAction.

  • Вы должны передать индекс и удаленный объект.

Другие вопросы по тегам