Clear() в деструкторе включенного списка.
От: v0rdych  
Дата: 23.11.10 08:33
Оценка:
Здравствуйте. Предположим, есть класс
public class TestList :IEnumerable
{
    private List<TestListElement> elementsList;
    public TestList()
    {
        elementsList = new List<TestListElement>();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return elementsList.GetEnumerator();
    }
}

Есть ли смысл создавать у него деструктор следующего вида:
    ~TestList()
    {
        elementsList.Clear();
    }

Варианты ответа: "Да, нужно же помочь сборщику мусора", "Без разницы", "Нет, т.к. бессмысленная пустая работа", "Ни в коем случае, т.к. это может привести к модификации коллекции при перечислении."
Re: Clear() в деструкторе включенного списка.
От: Lloyd Россия  
Дата: 23.11.10 08:40
Оценка: 2 (1) +1
Здравствуйте, v0rdych, Вы писали:

V>Варианты ответа: "Да, нужно же помочь сборщику мусора", "Без разницы", "Нет, т.к. бессмысленная пустая работа", "Ни в коем случае, т.к. это может привести к модификации коллекции при перечислении."

Не стоит, используте деструктор для освобождение unmanaged-ресурсов, с остальным прекрасно справляется сборщик мусора.
Re: Clear() в деструкторе включенного списка.
От: QrystaL Украина  
Дата: 23.11.10 08:42
Оценка: 1 (1)
Здравствуйте, v0rdych, Вы писали:
V>Варианты ответа: "Да, нужно же помочь сборщику мусора", "Без разницы", "Нет, т.к. бессмысленная пустая работа", "Ни в коем случае, т.к. это может привести к модификации коллекции при перечислении."

Нет, т.к. бессмысленная пустая работа
Re: Clear() в деструкторе включенного списка.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.11.10 09:06
Оценка:
Здравствуйте, v0rdych, Вы писали:

V>Варианты ответа: "Да, нужно же помочь сборщику мусора", "Без разницы", "Нет, т.к. бессмысленная пустая работа", "Ни в коем случае, т.к. это может привести к модификации коллекции при перечислении."

Последний ответ тоже справедлив.
Re[2]: Clear() в деструкторе включенного списка.
От: QrystaL Украина  
Дата: 23.11.10 09:17
Оценка:
S>Последний ответ тоже справедлив.

Ну если финализатор вызвался, то уже никакой работы с объектом не получится, какая тут енумерация? )
Re[3]: Clear() в деструкторе включенного списка.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.11.10 09:28
Оценка: 3 (1)
Здравствуйте, QrystaL, Вы писали:

S>>Последний ответ тоже справедлив.


QL>Ну если финализатор вызвался, то уже никакой работы с объектом не получится, какая тут енумерация? )


Если попросить перечислитель списка при жизни объекта, а потом бросить ссылки на объект, то объект соберется GC, а сам список останется до тех пор пока не собран перечислитель. Так что ничто не мешает перечислять элементы списка, чей owner уже собран сборщиком. Вот в таком случае очистка списка при финализации объекта повлечет исключение при дальнейшем использовании перечислителя.
Re[2]: Clear() в деструкторе включенного списка.
От: Lloyd Россия  
Дата: 23.11.10 18:53
Оценка:
Здравствуйте, Lloyd, Вы писали:

V>>Варианты ответа: "Да, нужно же помочь сборщику мусора", "Без разницы", "Нет, т.к. бессмысленная пустая работа", "Ни в коем случае, т.к. это может привести к модификации коллекции при перечислении."

L>Не стоит, используте деструктор для освобождение unmanaged-ресурсов, с остальным прекрасно справляется сборщик мусора.

Более того, в общем случае нельзя в финализаторе обращаться к ссылочным полям, т.к. для них уже может быть вызван финализатор и они могут находиться в невлидном состоянии.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.