C#词典仅存储对象的引用还是作为键添加的对象的完整副本?

时间:2019-04-05 08:52:42

标签: c# dictionary

我想将一个类用作字典的键。但是就内存消耗而言,该类很大。因此,我想知道,当我们将对象添加为字典的键时,它只是添加其引用还是添加了完整副本。这样,如果添加了对象的完整副本,那么我就可以使用对象的哈希码。

3 个答案:

答案 0 :(得分:6)

字典存储传入的任何值-键和条目的值都是这种情况。对于引用类型,该值是一个引用-无需克隆即可复制该引用所引用的对象。这是一个示例:

var dictionary = new Dictionary<int, StringBuilder>();
var builder = new StringBuilder("x");
dictionary.Add(5, builder);

// Retrieve the reference from the dictionary and append to it
dictionary[5].Append("y");

Console.WriteLine(builder); // Prints xy

这表明事物的 value 方面。密钥以相同的方式存储(作为参考),但是这里有一个警告……如果您更改密钥所指的对象,那么从根本上说,在大多数情况下,这将破坏字典,因为密钥是哈希码在添加条目时进行计算。通常,您将不可变类型(如string)用作字典的键。

答案 1 :(得分:2)

修改后的答案: C#词典仅存储对这些Class实例的引用以及键类型的哈希码。它本身不存储实际值。

答案 2 :(得分:2)

对于引用类型,对键和值的引用将存储在entry结构中。 键和值之间的区别在于,我们在键上比较了use,以使其保持唯一。复制的唯一内容是指向该对象所在的内存的指针(引用)。

Reference type in C#