#c# #garbage-collection #weak-references
#c# #сбор мусора #слабые ссылки
Вопрос:
(К вашему сведению: этот вопрос наполовину теоретический. Это не то, что я определенно планирую делать.)
Я хотел бы иметь возможность сохранять ссылки на все объекты, которые я создаю. Может быть, так:
class Foo
{
private static List<Foo> AllMyFoos = new List<Foo>();
public Foo()
{
AllMyFoos.Add(this);
}
}
Проблема в том, что теперь ни один из моих Foo никогда не может выйти из фокуса и быть собранным мусором. Есть ли какой-либо способ сохранить ссылку, не мешая сборщику мусора?
В идеале я просто список объектов, которые все еще используются, а не все объекты, которые когда-либо использовались.
Комментарии:
1. ИМХО, если у вас есть ссылка, то она не может быть собрана с помощью garbarge, поэтому вам следует подумать об этом по-другому.. Может быть, если вы объясните, где вы хотите получить теоретическую информацию, мы сможем быть более полезными?
2. Как GC должен знать разницу. Должна быть какая-то логика в том, какие объекты следует сохранить и какие объекты собирать в мусор. Если есть какая-то логика, вы должны быть в состоянии ее реализовать. Интерфейс IDisposable — один из способов избавиться от нежелательных объектов. Просто удалите объект из статического списка в методе dispose .
3. @gbianchi вы не совсем правы,
WeakRefernce
в .net есть4. @vittore да, да, похоже, Google знает об этом ;).. Я спрашивал о теоретической вещи, к которой OP хочет добраться, но ответы уже скрывают, что это существует…
Ответ №1:
Используйте WeakReference — он делает именно то, что должен. Будьте осторожны при работе с ним — вы должны проверять, действительна ли ссылка каждый раз, когда вы разыменовываете ее.
Foo foo = AllMyFoos[index].Target as Foo;
if (foo == null)
{
// Object was reclaimed, so we can't use it.
}
else
{
// foo is valid. My theoretical curiosity can be satisfied
}
Предупреждение: только потому, что объект еще не был собран мусором, не означает, что кто-то не вызывал Dispose
его или каким-либо другим способом не переводил его в состояние, в котором он не готов к повторному использованию.
Комментарии:
1. Также
ConditionalWeakTable<K,V>
есть, в зависимости от того, каковы точные требования OP. msdn.microsoft.com/en-us/library/dd287757.aspx
Ответ №2:
Есть специальная вещь, которая называется именно так — WeakReference