В. Есть ли способ узнать, есть ли у объекта какие-либо «сильные ссылки» на него?
Раймонд Чен намекнул, что решение может быть возможным :
Вы хотите знать, есть ли ссылка count равен нулю или отличен от нуля. Для этого, используйте WeakReference.
Этот пример кода демонстрирует проблемы, связанные с использованием сборщик мусора и свойство 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");
Нет, не без использования API отладчика.
Как вы говорите, объекты не подсчитываются по ссылкам ... поэтому единственный способ узнать это - просмотреть кучу, что обычно происходит как часть сборки мусора.
Обратите внимание, что даже после отсутствия «нормальных» сильных ссылок объект все равно может быть воскрешен как часть финализации - по сути, очередь финализатора имеет ссылку на него, если у нее есть финализатор. Возможно, вы в любом случае не захотите включать объект как «не имеющий ссылок».
Сначала вызовите GC.Collect ()
и , затем проверьте WeakReference.IsAlive
. Если это истина
(т.е. он не был собран после вызова GC.Collect ), то где-то есть сильная ссылка.
Прочтите сообщение Раймонда Чена о вчерашнем подсчете ссылок. После этого вы должны решить, действительно ли вам нужно это делать и почему. Тогда вернись и расскажи нам, почему.
Хм, похоже, вы прочитали пост - усвоили мелкие детали и упустили суть.
Я хочу знать, безопасно ли вызывать Dispose при подключении к базе данных.
Прочтите документацию. Dispose вызывает Close. Закрыть можно безопасно звонить сколько угодно.
Приложение может вызывать Close более одного раза. Никаких исключений не создается.