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

V K*_*V K 2 c# dictionary

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

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为问题具体是关于**键的,因此以`new Dictionary &lt;StringBuilder,int&gt;();`'为例会更好。 (3认同)

Dan*_*dré 5

修改后的答案:C#字典仅存储对这些类实例的引用和密钥类型的哈希码。它本身不存储实际值。

  • 不,引用类型*不是*通过引用传递。引用是按值传递的。请参阅 https://jonskeet.uk/csharp/parameters.html (4认同)