Сбор мусора слабая ссылка против структуры ссылки - PullRequest
0 голосов
/ 02 июня 2019

Я делаю некоторые вопросы практического теста, и один из них выглядит следующим образом:

Вы создаете класс с именем Data, который включает в себя объект словаря с именем _data.Необходимо разрешить процессу сбора мусора собирать ссылки на объект _data.Как вы должны заполнить соответствующий код?

public class Data
{
    <replace1>
    public Data(int count)
    {
        for (int i = 0; i < count; i++)
        {
            <replace2>
        }
    }
}

Вот варианты:

static Dictionary<int, WeakReference> _data;
static Dictionary<int, Int32> _data;
_data.Add(i, new WeakReference(new Class(i*2), false));
_data.Add(i, (Int32)(i*2));

Поскольку, в основном, вопрос «следует использовать WeakReference илиссылка на структуру, если вы хотите, чтобы сборщик мусора мог собирать ваши объекты? "Я подумал, что структура Int32 будет лучшим выбором, поскольку она не ссылается ни на один объект в куче, и, таким образом, этот объект может быть немедленно собран мусором, даже если слабые ссылки не сохраняют объект живым, если на него нет сильных ссылок (насколько я понял) Я все еще думал, что структура будет лучшим ответом , но практический тест говорит, что WeakReference является правильным ответом .Имейте в виду, что этот практический тест был неправильным даже для самых очевидных и простых вопросов.

Не могли бы вы объяснить, почему в этом случае WeakReference будет лучше подходить, чем структура, если мы хотим, чтобы GCбыть в состоянии собрать наш объект?

1 Ответ

1 голос
/ 02 июня 2019

Чтобы позволить ГХ собирать объекты, вы должны использовать WeakReference, поскольку он не содержит строгой ссылки на ваши объекты. Смотри: https://docs.microsoft.com/de-de/dotnet/api/system.weakreference

В вашем случае структура будет помещена в кучу, потому что вы храните ее в Словаре, который, очевидно, хранится в куче. Поэтому будет создана надежная ссылка, и ваша структура не будет собрана, пока вы не удалите ее из словаря.

Обычно вы используете WeakReference, когда хотите кэшировать большие объекты, но вам не нужно, чтобы они были доступны постоянно. Таким образом, WeakReference позволяет GC собирать объект, когда вашей программе требуется хранилище в другом месте.

...