| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Dispose и Finalize |
| Автор: Дрон 2.11.2005, 15:10 |
| Как мне показалось, программисты в основном забивают на эти методы, надеясь на автоматический GC. Вот, хочется выяснить, как обстоят дела с их использованием. Вызываете ли вы Dispose для стандартных классов? Пишите ли метод Dispose и деструкторы для собственных классов? И какие вообще рекомендации существуют по этому поводу. |
| Автор: nikf 2.11.2005, 15:17 |
| Если есть Dispose всегда его вызываю. Для свих класов делаю реализацию IDisposable толко в том случае если он сам содержит объекты реализующие IDisposable. Вот и все рекомендации. Врядли будут еще какие |
| Автор: Exception 2.11.2005, 15:19 |
| вызываю. но своих не пишу, если нече2о освобождать |
| Автор: Дрон 2.11.2005, 15:20 | ||
Естественно. Просто недавно на собеседовании в одной компании у меня как раз возник спор об использовании Dispose Да и в том проекте, где я сейчас занят -- на сотни тысяч строк практически ни одного Dispose |
| Автор: Plamenk 2.11.2005, 17:36 |
| Dispose нужен только там, где есть неуправляемые объекты (в случае когда пишется пользоваетельский класс). А что касается вызывать его или нет? То вызывать конечно надо... Но если не вызвать, то всё равно больших проблем не будет, так как его вызовет деструктор, но немного позже. |
| Автор: Exception 2.11.2005, 19:13 |
| ...который не обязательно выполнится. Ведь .NET не обеспечивает детерминированного завершения. |
| Автор: Plamenk 3.11.2005, 09:11 | ||
Ты хочешь сказать, что NET не гарантирует вызов деструктора? |
| Автор: Дрон 3.11.2005, 09:33 | ||
Гарантирует. Но в какой именно момент -- неизвестно. |
| Автор: Plamenk 3.11.2005, 09:43 | ||
Так и я о том же |
| Автор: Exception 3.11.2005, 10:32 |
| ага. "Немного позже" == при выгрузке AppDomain |
| Автор: Plamenk 3.11.2005, 10:46 | ||
А что деструкторы вызваются при
А я думал что, при сборке муссора. Хотя могу ошибаться |
| Автор: Exception 3.11.2005, 14:17 | ||
дык сборка мусора и происходит при выгрузке домена приложения. И то не всегда. Создай консольное приложение, напиши класс типа
и насоздавай кучу таких объектиков. Не факт, что ты увидишь какие-то сообщения. ЗЫ деструктор в С++ != завершитель в С#. Надо это помнить |
| Автор: Plamenk 3.11.2005, 15:27 | ||
Посмотри за окном output. У меня не разу не получилось, чтобы хотябы для одного объекта не вызвался деструктор.
Может в VB.Net, что-то по другому? |
| Автор: Exception 3.11.2005, 20:52 |
| может я и ошибаюсь... компа нета проверить... мне казалось, GC происходит не всегда |
| Автор: mr.DUDA 4.11.2005, 10:23 | ||||
| GC, вообще-то, собирает мусор только в двух случаях: а) когда он посчитает, что свободной памяти ему маловато (10000 таких объектов - это что-то вроде 40-60 Кб) б) когда приложение простаивает Принудительно можно вызвать цикл сборки мусора с пом. GC.Collect(), тогда и увидим сообщения из деструкторов. З.Ы.
Сборка мусора происходит периодически, при выполнении условий а) и б). При выгрузке домена приложения вся выделенная ему память освобождается целиком. |
| Автор: -ser- 7.11.2005, 08:36 |
| что касается Finalize, то его по многим причинам не рекомендуется вообще использовать если нет на это острой необходимости. и даже в объектах, работающих c unmanaged ресурсами, если корректно закрывать файл, поток или соединение в сети, то я считаю, даже и здесь его лучше не упоминать. вообще, объекты с этим методом занимает больше по времени разместить и также удалить, что может значительно сказаться на быстродействии. ГК нужно запуститься по меньшей мере 2 раза чтобы полностью удалить такой объект, причем удаляется каждый такой объект по-отдельности, а что если у нас массив из 10000 таких объектов. |
| Автор: Exception 8.11.2005, 15:36 |
| кстати, [offtop] я так и не понял, как ловить исключения, вызванные финалайзером. они же не ловятся обычным способом (т.к. в другом потоке)... [/offtop] |
| Автор: -ser- 10.11.2005, 07:06 | ||
Run-time error
|
| Автор: Exception 10.11.2005, 14:31 | ||
| не-а. я пробовал вроде такого:
эксепшн лез |