Как сохранить слабую ссылку на объект? - PullRequest
4 голосов
/ 11 октября 2011

(К вашему сведению: этот вопрос наполовину теоретический. Это не то, что я определенно планирую сделать.)

Я бы хотел сохранить ссылку на все объекты, которые я создаю. Может быть так:

class Foo
{
    private static List<Foo> AllMyFoos = new List<Foo>();

    public Foo()
    {
        AllMyFoos.Add(this);
    }
}

Проблема в том, что теперь ни один из моих Foos не может выпасть из фокуса и быть собранным мусором. Есть ли способ сохранить референцию, не мешая сборщику мусора?

В идеале я просто из списка ФУ, которые все еще используются, а не всех ФУ, которые когда-либо использовались.

Ответы [ 2 ]

6 голосов
/ 11 октября 2011

Использовать 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 голос
/ 11 октября 2011

Есть специальная вещь, которая названа именно так - Слабая ссылка

...