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

NSj*_*nas 21 .net c# dictionary reference-type

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

这个系列非常大,每个产品都有1-10个钥匙.我主要关心的是内存分配.

zmb*_*mbq 30

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

  • 元组是引用类型. (5认同)

Chr*_*ett 5

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

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

  • 上面的评论在 2 年前可能是也可能不是,但现在已经不是了。标准的 .NET 序列化器/反序列化器似乎可以很好地处理字典,至少在 .NET 4.0 及更高版本中是这样。 (3认同)

Ser*_*rvy 5

Dictionary存储您传递给它的密钥值的副本。它或任何其他集合/容器都不可能存储对任何值的引用,因为容器可能比您尝试存储在其中的变量寿命更长。

现在,正如其他人所说,如果值的类型是引用类型,则变量的值只是一个引用,因此您只需存储对该变量的引用的副本。如果字典值的类型是值类型,则将复制实际值。