C # Новое ключевое слово на существующих объектах - PullRequest
33 голосов
/ 13 июля 2011

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

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

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

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

Ответы [ 9 ]

35 голосов
/ 13 июля 2011

В вашем примере Red Car экземпляр c станет правомочным на сборку мусора, когда c назначено на Blue Car.Вам не нужно ничего делать.

Ознакомьтесь с этой (старой, но все еще актуальной) статьей MSDN о сборщике мусора .NET.http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Первый абзац говорит сам за себя:

Сборка мусора в общеязыковой среде выполнения Microsoft .NET полностью освобождает разработчика от необходимости отслеживать использование памяти и знать, когда ее освобождать..

33 голосов
/ 13 июля 2011

Поскольку ссылка использовалась повторно , сборщик мусора утилизирует / обрабатывает «Красную машину» после потери ссылки?

Вы смотрите на это, возможно, неправильно:

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 -блоков, у вас, как правило, все будет хорошо.

7 голосов
/ 13 июля 2011

Вы создаете новый объект и присваиваете ссылку на него своей переменной c.В то же время на предыдущий объект («красную машину») больше не ссылаются, и он может быть собран мусором.

6 голосов
/ 13 июля 2011

Если больше нет ссылок на красный автомобиль, он будет собран GC на следующем цикле. Вам не нужно ничего лишнего (если только это не класс, в котором есть потоки и т. Д., Которые нужно удалить)

5 голосов
/ 13 июля 2011

Сборщик мусора будет заниматься очисткой красной машины, когда она больше не укоренена (недоступна). Вам, разработчику, обычно не нужно беспокоиться об очистке памяти в .Net.

Необходимо упомянуть три оговорки:

  1. Это не произойдет сразу. Сбор мусора произойдет, когда это произойдет. Вы не можете предсказать это.
  2. Если тип реализует IDisposable, вы должны убедиться, что вызывается метод .Dispose (). using заявление - хороший способ сделать это.
  3. Вы упомянули, что это большой объект. Если его размер превышает 85000 байт, он будет храниться в месте, называемом кучей больших объектов, в котором действуют совершенно разные правила сбора мусора. Разрешение частого повторного использования такого типа объектов может вызвать проблемы.
0 голосов
/ 13 июля 2011

Я думаю, вы должны реализовать интерфейс IDispose для очистки неуправляемых ресурсов

public class car : IDispose 
0 голосов
/ 13 июля 2011

В случае, если Car содержит некоторые собственные ресурсы, вы захотите реализовать IDisposable и правильно утилизировать его перед повторным использованием переменной.

0 голосов
/ 13 июля 2011

ГХ подберет ваш Red Car объект и утилизирует его.

Вы можете вызвать пользовательский деструктор или реализовать IDisposable, если у вас есть ресурсы, которые должны быть освобождены, когда исходный объект больше не используется.

0 голосов
/ 13 июля 2011

Сборщик мусора позаботится об утилизации объекта Авто

...