Вопрос. Есть ли способ узнать, есть ли у объекта "сильные ссылки" на него?
Рэймонд Чен намекнул, что решение возможно :
Вы хотите знать, равен ли счетчик ссылок нулю или отличному от нуля. Для этого используйте WeakReference.
Примечания
- у меня есть "слабая ссылка" на объект (с использованием WeakReference). Если бы у меня была сильная ссылка, ответ был бы немедленно: "Да. У вас есть сильная ссылка на объект".
- сборщик мусора не предоставляет ответов
- свойство IsAlive может сообщить вам, только если объект были собраны или нет. Нет, если есть сильные ссылки на это, или нет. (Объект без ссылок можно разобрать - GC просто еще не дошел до него)
- объекты в .NET не учитываются при подсчете ссылок
- не все объекты должны реализовывать интерфейс IDisposable.
- не все объекты мои
Пример кода
Этот пример кода демонстрирует проблемы, связанные с принудительной сборкой мусора и свойством WeakReference IsAlive
, чтобы определить, есть ли у объекта какие-либо необработанные ссылки на него.
WeakReference m_wr = null;
...
for (int i = 0; i < 1000000; i++)
{
Pig p = new Pig();
m_wr = new WeakReference(p);
}
...
GC.Collect();
if (m_wr.IsAlive)
Environment.FailFast("All objects should have been collected by now");
WeakReference.IsAlive
- person Tim Robinson   schedule 12.08.2010IsAlive
возвращаетtrue
, все, что я могу сделать, это то, что объект не был собран. ЕслиIsAlive
возвращаетfalse
, все, что я могу сделать, это то, что объект был собран. я хочу знать, есть ли у объекта сильные ссылки на него. Объект с сильными ссылками не будет собран, но не все несобранные объекты имеют на них сильные ссылки. - person Ian Boyd   schedule 12.08.20101.
Для улучшения всего человечества, чтобы расширить горизонт человеческих знаний2.
я выполняю диссертацию о физических эффектах деградации объектов с сильными ссылками в оперативной памяти DDR в системах с пониженной тактовой частотой.3.
я хочу знать, безопасно ли вызывать Dispose при подключении к базе данных.4.
я хочу поймать ошибку, когда кто-то ссылается на объект, но я уверен, что никто не должен этого делать.5.
Потому что кто-то еще спрашивал, но люди отказывались отвечать на вопрос. - person Ian Boyd   schedule 12.08.2010GC.Collect; WR.IsAlive
хорош. Единственный верный способ ответить, где все сильные ссылки? заключается в выполнении сборки мусора. Альтернативой может быть приостановка программы, отслеживание корней сборщика мусора и обход ссылок на объекты самостоятельно, но сборщик мусора все равно делает именно это. - person Tim Robinson   schedule 12.08.2010