Вы можете избежать хранения нескольких штучных экземпляров с одинаковыми значениями, реализовав кэш предварительно упакованных значений, которые часто используются. Например, если число 0
и логическое значение false
часто вставляются в качестве значений, вы можете реализовать словарь, оптимизированный для памяти, например:
public sealed class ObjectDictionary<TKey> : Dictionary<TKey, object>
{
private readonly object _cached_0 = 0;
private readonly object _cached_false = false;
public new void Add(TKey key, object value)
{
if (value is int && (int)value == 0)
{
base.Add(key, _cached_0);
}
else if (value is bool && (bool)value == false)
{
base.Add(key, _cached_false);
}
else
{
base.Add(key, value);
}
}
}
Исходные нули в штучной упаковке и ложные значения, которые передаются вметод Add
будет сразу же иметь право на сборку мусора, так как они не будут храниться в словаре. Если это все еще проблема для сборщика мусора, то источником проблемы является не словарь, а что-то еще.
Обратите внимание, что наследование от Dictionary<TKey, object>
, вероятно, неочень хорошая идея . Пример кода выше только для демонстрации концепции.