Как сохранить слабую ссылку на объект?

#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