Словарь слабых и неслабых ссылок
У меня есть пользовательский тип 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 ответ:
Расширяя ответ CodesInChaos, я думаю, что вы на правильном пути, используя слабые ссылки в вашем оригинале
Помните, что хранение ссылки на объект дешево. Я думаю, что вы должны быть в порядке миллионов или миллиардов ссылок, прежде чем это начнет становиться проблемой.Dictionary
, и я думаю, что имеет смысл использовать вторую структуру данных - вероятно,HashSet
будет хорошо работать здесь - которая просто содержит ссылки на объекты, которые были изменены.