С# Ключевое слово "новое" для существующих объектов
Мне было интересно узнать, что происходит с объектом (на С#), как только его ссылка будет переназначена. Пример:
Car c = new Car("Red Car");
c = new Car("Blue Car");
Поскольку ссылка была повторно использована, сборщик мусора распоряжается/обрабатывает "Красный автомобиль" после того, как он потерял ссылку? Или нужен отдельный метод для утилизации "красного автомобиля"?
Мне в первую очередь интересно, потому что есть относительно большой объект, который я собираюсь перерабатывать, и нужно знать, есть ли что-то, что нужно сделать, когда оно будет воссоздано.
Ответы
Ответ 1
В вашем примере экземпляр Red Car
c
станет пригодным для сбора мусора, когда c
назначен на Blue Car
. Вам не нужно ничего делать.
Ознакомьтесь с этой (старой, но все еще актуальной) статьей MSDN о сборщике мусора .NET. http://msdn.microsoft.com/en-us/magazine/bb985010.aspx
В первом абзаце все сказано:
Сборка мусора в общеязыковой среде выполнения Microsoft.NET полностью освобождает разработчика от необходимости отслеживать использование памяти и знать, когда ее освободить.
Ответ 2
Поскольку ссылка была повторно использована, сборщик мусора распоряжается/обрабатывает "Красный автомобиль" после того, как он потерял ссылку?
Вы смотрите на это, пожалуй, неправильно:
c [*] ----> [Car { Name = "Red Car" }] // Car c = new Car("Red Car")
Затем ваш следующий шаг:
c [*] [Car { Name = "Red Car" }] // No chain of references to this object
\------> [Car { Name = "Blue Car" }] // c = new Car("Blue Car")
В какой-то момент в будущем GC придет и "соберет" любой из этих объектов, которые не будут иметь ссылки на живой объект. Для большинства задач, пока вы используете управляемые данные, вы не должны беспокоиться о больших объектах и небольших объектах.
Для большинства задач вы беспокоитесь только об детерминированном управлении памятью при работе с IDisposable
. До тех пор, пока вы будете следовать лучшей практике using
-блоков, вы, как правило, будете в порядке.
Ответ 3
Вы создаете новый объект и назначаете ссылку на него своей переменной c
. В то же время предыдущий объект ( "красный автомобиль" ) больше не упоминается и может быть собрано в мусор.
Ответ 4
Если нет других ссылок на красный автомобиль, он будет собран GC в следующем цикле. Вам не нужно ничего лишнего (если только это класс, который имеет потоки и т.д., Которые должны быть удалены)
Ответ 5
Сборщик мусора будет обрабатывать очистку для красного автомобиля, если он больше не укоренен (недоступен). Вы, разработчик, обычно не должны беспокоиться об очистке памяти в .Net.
Есть три оговорки, которые необходимо упомянуть:
- Это не произойдет сразу. Сбор мусора произойдет, когда это произойдет. Вы не можете предсказать это.
- Если тип реализует IDisposable, вам нужно убедиться, что вы вызываете метод .Dispose(). A
using
- хороший способ выполнить это.
- Вы упомянули о нем большой объект. Если он содержит более 85000 байт, он будет храниться в месте под названием Large Object Heap, которое имеет очень разные правила сбора мусора. Разрешить рециркуляцию такого типа часто может вызвать проблемы.
Ответ 6
Сборщик мусора позаботится об утилизации объекта автомобиля
Ответ 7
GC возьмет ваш объект Red Car
и избавьтесь от него.
Вы можете вызвать пользовательский деструктор или реализовать IDisposable, если у вас есть ресурсы, которые необходимо освободить, когда исходный объект больше не используется.
Ответ 8
В случае, если Car
содержит некоторые собственные ресурсы, вы захотите реализовать IDisposable
и избавиться от него правильно, прежде чем повторно использовать переменную.
Ответ 9
Я думаю, вы должны реализовать интерфейс IDispose для очистки неуправляемых ресурсов
public class car : IDispose