c# - 使用对象 TValue 避免在 Dictionary 中装箱/拆箱

标签 c# performance dictionary boxing unboxing

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

根据这些引用资料:

装箱和拆箱会影响我们的性能,例如 GC 压力。问题是有什么方法可以避免在其 TValueobject 的 Dictionary 中装箱/拆箱。

Dictionary<string, object>

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

最佳答案

您可以通过实现频繁使用的预装箱值的缓存来避免存储相同值的多个装箱实例。例如,如果号码 0和 bool 值 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 .上面的代码示例只是为了演示这个概念。

关于c# - 使用对象 TValue 避免在 Dictionary 中装箱/拆箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351951/

相关文章:

c# - 为什么下面的泛型方法调用不需要类型?

c# - AuthenticationManager.GetExternalLoginInfoAsync() 始终为空

mysql - phpmyadmin 中的 sql 查询非常慢

python - 加权遍历算法(广度优先更好?)

python - 为什么在这种情况下从 namedtuple 继承会导致无限递归?

c# - 如何使用 C# 创建带有日期时间的文本文件名

c# - 是否有人为 .NET 发布了更强大的 BitArray?

php - require_once() 或不 require_once()

java - 如何在UnfoldingMap中将km转换为像素

python - 将列表转换为字典,使用列表中的键和值