Вопрос о статических членах внутри нестатических классов и сборке мусора - PullRequest
9 голосов
/ 08 октября 2010

Мой коллега утверждает, что в C # наличие статических членов в нестатических классах предотвращает сборку мусора экземплярами этих классов и что это является общим источником утечек памяти в C #.В результате он всегда оборачивает статические члены в статический класс и получает оттуда доступ к ним через статическое свойство или метод (ы) этого статического класса.Я всегда думал, что статика была в стеке, а не в куче, и поэтому не имела ничего общего со сборкой мусора.Мне это не кажется правильным.

В чем правда?

Ответы [ 3 ]

10 голосов
/ 08 октября 2010

Он не знает, о чем говорит.Статические члены внутри нестатического класса не предотвращают сборку мусора экземплярами класса.

При этом статика может находиться в стеке или куче.Это не имеет значения для сбора мусора.Важно то, что статические части типа не хранятся вместе с экземплярами типа.

5 голосов
/ 09 октября 2010

Статические члены являются корнями для GC.Все, на что ссылается статическое, будет сохранено.Является ли статическая ссылка статическим или нестатическим классом, не имеет значения.

Если у вас есть нестатический класс, имеющий статическое поле, и у вас есть экземпляры этого класса, статическое полене имеет много экземпляров - это часть определения статического - это не поле для каждого экземпляра.То, является ли сам класс статическим или нет, не имеет значения.

Так что да, статические ссылки часто являются причиной утечек памяти, особенно статических событий, от которых вы не отписались, когда это уместно.Изменение статического класса не решит проблему утечки памяти - вам нужно удалить статическую ссылку, когда закончится время жизни экземпляра, на который он ссылается.Часто это делается с помощью Dispose () объекта и с помощью Dispose очищает ссылку / подписку на событие.

Это - хорошее место, чтобы узнать больше о том, как работает GC, какон идентифицирует мусор и что он делает с этим.А также финализаторы и многое другое ...

0 голосов
/ 08 октября 2010

Ваш друг неверен.

Идея статического метода состоит в том, что НЕТ экземпляра этого класса.Так что ничего не существует для сбора мусора.

Попробуйте поместить this внутри статического метода в нестатический класс и посмотрите, что произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...