.NET:Dictionary值是通过引用还是值存储的

时间:2012-10-24 22:41:40

标签: c# .net dictionary reference-type

我有Dictionary<int, Product>。如果将同一产品添加到多个密钥,则为每个密钥存储该对象的新实例?或者只是对原始对象的引用?

此集合非常大,每个产品都有1-10个密钥。我主要关注的是内存分配。

4 个答案:

答案 0 :(得分:29)

如果Product是引用类型(类而不是struct),则只存储引用。

答案 1 :(得分:4)

不,它应该使用与原始对象相同的引用。

但是,如果将字典序列化/反序列化,我并不完全确定它的行为方式。

答案 2 :(得分:3)

Dictionary会记录您传递密钥值的副本。对于它或任何其他集合/容器来说,它不可能存储对任何值的引用,因为容器可能比你试图存储在其中的变量更长。现在,正如其他人所说,如果值的类型是引用类型,则变量的值只是一个引用,因此您只需将引用的副本存储到变量中。如果字典值的类型是值类型,则将复制实际值。

答案 3 :(得分:0)

引用类型始终存储为引用。没有人会猜测你想要什么样的“克隆”逻辑。如果你需要副本,你必须自己创建它们才能放入容器,传递给其他功能等等。

复制

值类型(简单地创建字节表示副本,但所有引用值仍将是引用),除非作为ref传递给函数。对于容器,虽然它们将是副本。除非你为它们创建一个引用类型包装器。