C#中Dictionary添加新值时覆盖原有值的原因是什么?
解决C# Dictionary添加条目后所有值相同的问题
嘿,这个坑我踩过!你遇到的问题几乎可以肯定是重复使用了同一个引用类型对象实例导致的——字典里存储的是对象的引用,而不是对象本身的副本。当你反复修改同一个对象的属性再添加到字典时,所有条目都会指向这个唯一的实例,最后一次修改的结果就会覆盖所有条目的显示值。
错误代码示例(重现问题)
假设你有这样的代码:
public class MyData { public string Name { get; set; } public int Age { get; set; } } // 错误写法:重复使用同一个MyData实例 var userDict = new Dictionary<int, MyData>(); var singleUser = new MyData(); for (int id = 1; id <= 3; id++) { singleUser.Name = $"User{id}"; singleUser.Age = 20 + id; userDict.Add(id, singleUser); }
运行这段代码后,你会发现userDict里的所有条目,Name都是User3,Age都是23——因为所有键都指向同一个singleUser对象,最后一次循环的修改覆盖了之前的属性值。
正确的解决方法
每次添加新条目时,创建一个新的对象实例,而不是复用同一个:
var userDict = new Dictionary<int, MyData>(); for (int id = 1; id <= 3; id++) { // 每次循环都新建MyData对象 var newUser = new MyData(); newUser.Name = $"User{id}"; newUser.Age = 20 + id; userDict.Add(id, newUser); }
或者用对象初始化器简化代码,效果是一样的:
var userDict = new Dictionary<int, MyData>(); for (int id = 1; id <= 3; id++) { userDict.Add(id, new MyData { Name = $"User{id}", Age = 20 + id }); }
额外提醒
如果你的字典存储的是值类型(比如int、string、struct),不会出现这个问题——因为值类型在字典里存储的是实际值的副本,而不是引用。只有当存储的是引用类型(自定义类、数组、List等)时,才需要注意实例的创建时机。
内容的提问来源于stack exchange,提问作者Armature
相关产品推荐
相关产品推荐

