使用对象 TValue 在字典中避免 boxing/unboxing

Avoiding boxing/unboxing in Dictionary with object TValue

有时我们需要在具有各种值类型的字典中存储键值对的集合。假设我们要存储一个由 boolean、int、string 值组成的表单。其中一些值类似于 ValueType,当我们将它们转换为 ReferenceType(例如 object 时,它会导致装箱。

根据这些参考:

装箱和拆箱会影响我们的性能,例如 GC 压力。问题是有什么办法可以避免字典中的 boxing/unboxing 它的 TValueobject.

Dictionary<string, object>

如何避免这种情况下的装箱和拆箱?

您可以避免存储 相同值的多个装箱实例,方法是对经常使用的预装箱值实施缓存。例如,如果数字 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> is probably not a very good idea。上面的代码示例只是为了演示这个概念。