.NET сборщик мусора - PullRequest
       1

.NET сборщик мусора

2 голосов
/ 01 июля 2010

Это записано в ссылке http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

"Когда приложение создает новый объект, новый оператор выделяет память из кучи. Если тип объекта содержит метод Finalize, тогда указатель наобъект помещен в очередь на финализацию. "

Может кто-нибудь объяснить мне

1) Это означает, что только когда мы явно используем finalize (используя деструктор), объект будет идти к очереди финализации.

2) Каждый класс .NET неявным образом использует finalize (используя деструктор), поэтому весь объект библиотеки классов .net перейдет в очередь завершения.

3) как насчет нашего пользовательского класса, такого как classs A {}Класс A obj пойдет, чтобы завершить или нет, учитывая оба случая (явный / неявный деструктор)

4) Если вышеприведенный класс записан в неуправляемом коде, что произойдет. Он пойдет для завершения очереди или нет

Спасибо

1 Ответ

3 голосов
/ 02 июля 2010

1) Да, к объектам, которые реализуют метод Finalize () («деструктор» в C #), добавляется очередь finalize.

2) Нет, большинство классов .NET не имеют Finalizer.Если вы не реализуете его в своем классе, экземпляры этого класса не будут добавлены в очередь завершения.

3) Вы, класс A, попадете в очередь финализации только тогда, когда он реализован как метод финализации.(«Деструктор» в C #

4) Неуправляемый класс не управляется.Он не будет собираться и не добавляться в очередь финализации.

Некоторые общие замечания.

  • Деструктор в C # не является деструктором в смысле C ++,У вас нет грантополучателей, когда он будет вызываться и т. Д. Это синтаксический сахар для написания метода финализатора.
  • Избегайте финализаторов, поскольку они добавляют дополнительные издержки.Сначала объект должен быть добавлен в очередь завершения.Затем он должен быть дважды собран мусором.Первый раз, чтобы обнаружить, что он больше не используется.Второй раз, когда метод финализатора завершился.
  • Используйте интерфейс IDisposable для управления и освобождения ресурсов.Особенно нативные ресурсы.
  • Используйте только финализатор для «аварийной очистки» нативных ресурсов.В основном вы проверяете, правильно ли был расположен объект (IDisposable) -интеррейс.Если нет, вы выполняете работу в финализаторе, чтобы предотвратить дальнейшую утечку ресурсов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...