Подтвердить что ты не робот

С# Ключевое слово "новое" для существующих объектов

Мне было интересно узнать, что происходит с объектом (на С#), как только его ссылка будет переназначена. Пример:

Car c = new Car("Red Car");
c = new Car("Blue Car");

Поскольку ссылка была повторно использована, сборщик мусора распоряжается/обрабатывает "Красный автомобиль" после того, как он потерял ссылку? Или нужен отдельный метод для утилизации "красного автомобиля"?

Мне в первую очередь интересно, потому что есть относительно большой объект, который я собираюсь перерабатывать, и нужно знать, есть ли что-то, что нужно сделать, когда оно будет воссоздано.

4b9b3361

Ответ 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