有时我们需要在具有各种值类型的字典中存储键值对的集合。假设我们要存储一个由 boolean、int、string 值组成的表单。其中一些值属于 ValueType,当我们将它们转换为 ReferenceType(例如 object
)时,它会导致装箱。
根据这些引用资料:
装箱和拆箱会影响我们的性能,例如 GC 压力。问题是有什么方法可以避免在其 TValue
为 object
的 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/