避免在字典中使用对象TValue进行装箱/拆箱

时间:2019-10-12 07:36:08

标签: c# performance dictionary boxing unboxing

有时,我们需要将键值对的集合存储在具有各种值类型的字典中。假设我们要存储一个包含布尔值,整数,字符串值的表单。其中一些值是 ValueType 类型,当我们将其强制转换为 ReferenceType 时,例如object会引起装箱。

根据这些参考文献:

装箱和拆箱会影响我们的表现,例如GC压力。问题是有什么方法可以避免在字典中{/ {1}}是TValue的装箱/拆箱。

object

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

1 个答案:

答案 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。上面的代码示例仅用于演示该概念。

相关问题