Как избавиться от объекта класса из списка <объект>

1

У меня есть Listbox, у которого есть 3 элемента, в которые можно выбрать только один элемент за раз. Свойства этих предметов доступны из разных классов - Alto, Zen, Esteem. Мне нужно использовать только 1 класс за раз. Я храню эти классы в массиве списка. Как я могу избавиться от моих желаемых классов (по моей логике)?

Список массива классов

List<object> lst = new List<object>();

Добавить каждый объект класса в список

Alto objAlto = new Alto();
Zen objZen = new Zen();
Esteem objEsteem = new Esteem();

lst.Add(objAlto);
lst.Add(objZen);
lst.Add(objEsteem);

Моя логика Dispose

Изображение 174551

Теперь мой вопрос: как я могу распоряжаться объектами? Почему я не могу получить ".Dispose"? Мне не хватает какого-либо неявного преобразования, чтобы воспользоваться этой функцией?

  • 0
    IDisposable на ваших классах и предоставьте метод Dispose В настоящее время у вас есть List<object> , вам нужен List<YourClass> с реализованным IDisposable . Еще одна вещь, вы действительно уверены, что вам нужно Dispose ? Вы обрабатываете какие-либо неуправляемые ресурсы.
Теги:
object
garbage-collection
dispose

2 ответа

1
Лучший ответ

Чтобы добавить к ответу D Stanleys, как насчет этого:

foreach(var o in lst.OfType<IDisposable>())
{
   o.Dispose();
}
  • 0
    +1 намного чище ...
  • 0
    Даже если o.Dispose () вызывается, почему фактический объект не удаляется? Есть ли способ использовать «ref» (просто пример) для удаления реального объекта?
Показать ещё 2 комментария
0

Почему я не могу получить ".Dispose"?

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

Мне не хватает какого-либо неявного преобразования, чтобы воспользоваться этой функцией?

Там не подразумевается преобразование, но если объекты реализуют IDisposable вы можете явно их использовать:

foreach(object o in lst)
{
   if(o is IDisposable)
      ((IDisposable)o).Dispose();
}

Однако есть пара дизайнерских странностей, которые я вижу:

  • Список объектов обычно является запахом кода. Если все объекты реализуют общий интерфейс или имеют общий базовый класс (кроме Object), было бы лучше использовать список более конкретного типа.
  • Как правило, любое создание объекта несет ответственность за его удаление. Альтернативой является создание того, что содержит объекты, реализующие IDisposable.
  • 0
    Даже если o.Dispose () вызывается, почему фактический объект не удаляется? Есть ли способ использовать «ref» (просто пример) для удаления реального объекта?
  • 0
    Что ты пытаешься сделать? .Dispose не удаляет объекты из памяти - это делает сборщик мусора, и только когда ничто не содержит ссылки на него - поэтому, чтобы сборщик мусора очистил объекты, вам нужно будет удалить их из списка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню