有时,我们需要将键值对的集合存储在具有各种值类型的字典中。假设我们要存储一个包含布尔值,整数,字符串值的表单。其中一些值是 ValueType 类型,当我们将其强制转换为 ReferenceType 时,例如object
会引起装箱。
根据这些参考文献:
装箱和拆箱会影响我们的表现,例如GC压力。问题是有什么方法可以避免在字典中{/ {1}}是TValue
的装箱/拆箱。
object
在这种情况下如何避免装箱和拆箱?
答案 0 :(得分:1)
通过实施经常使用的预装盒值的缓存,可以避免存储多个具有相同值的盒装实例。例如,如果频繁插入数字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>
继承可能是not a very good idea。上面的代码示例仅用于演示该概念。