Словарь слабых и неслабых ссылок


У меня есть пользовательский тип MyClass и фабричный класс Factory, который создает объекты типа MyClass по запросу.

Factory хранит созданные объекты в словаре, потому чтообъекты дорого создавать и бывают случаи, когда один и тот же объект можно попросить создать несколько раз. Каждый объект с одним и тем же тегом должен быть создан только один раз.

class MyObject
{
    // .. not important
}

class Factory
{
    private Dictionary<int, MyObject> m_objects = new Dictionary<int, MyObject>();

    public MyObject CreateObject(int tag, params object[] parameters)
    {
        MyObject obj;
        if (!m_objects.TryGetValue(tag, out obj))
        {
            obj = new MyObject();
            // .. some initialization
            m_objects.Add(tag, obj);
        }

        return obj;
    }
}

Объекты могут храниться и не храниться где-то снаружи. Factory на неизвестное количество времени. Объекты может быть изменен После создания. Бывают случаи, когда Factory хранит ссылку на объект, а объект больше нигде не хранится.

Теперь я хочу, чтобы сборщик мусора сделал свою работу. Я хочу, чтобы объекты не хранились где-либо вне Factory и не изменялись для сбора.

Моей первой мыслью было использовать слабые ссылки для значений в словаре внутри Factory, но, похоже, этот подход не работает с "измененным и непереведенным" случаем.

Как следует Я храню созданные объекты в словаре, чтобы они были:

  • можно было бы собирать мусор
  • не собирают мусор, когда на него не ссылаются, а изменяют?
1 2

1 ответ:

Расширяя ответ CodesInChaos, я думаю, что вы на правильном пути, используя слабые ссылки в вашем оригинале Dictionary, и я думаю, что имеет смысл использовать вторую структуру данных - вероятно, HashSet будет хорошо работать здесь - которая просто содержит ссылки на объекты, которые были изменены.

Помните, что хранение ссылки на объект дешево. Я думаю, что вы должны быть в порядке миллионов или миллиардов ссылок, прежде чем это начнет становиться проблемой.