C# Dictionary赋值给变量后操作同步原对象,原因是什么?
问题原因解析
你的代码出现这个现象,核心是C#里引用类型和值类型的赋值行为差异:
1. Dictionary是引用类型
Dictionary<TKey, TValue>属于引用类型,当你执行var tempDict = demoDict;时,并没有创建新的Dictionary对象,只是把demoDict指向的内存地址(引用)复制给了tempDict。这意味着tempDict和demoDict本质上指向的是同一个内存中的字典实例。所以不管通过哪个变量调用TryAdd,修改的都是同一个字典对象,自然会同步变化。
你的循环里两次赋值其实都是操作同一个字典,第一次TryAdd已经把keyAdded加入,第二次调用会因键已存在而失败,但本质上两个变量始终指向同一个对象。
2. 整数(值类型)的赋值行为
整数int是值类型,值类型赋值时会直接复制变量的实际值,而非引用。比如:
int a = 10; int b = a; b = 20; // 此时a还是10,b是20,两者互不影响
因为b拿到的是a的副本,两者在内存中是独立存储单元,修改其中一个不会影响另一个。
3. 关于“类的类似操作”的澄清
你提到“使用类进行类似操作时不会出现该问题”,这是误解——如果直接赋值类的引用,结果和Dictionary完全一致。比如:
public class MyClass { public int Value { get; set; } } var myObj = new MyClass { Value = 5 }; var tempObj = myObj; tempObj.Value = 10; // 此时myObj.Value也会变成10,因为两个变量指向同一个实例
如果你的类操作没出现这个问题,大概率是你在赋值时创建了新的类实例(用new关键字),而非直接复制引用。比如:
var tempObj = new MyClass { Value = myObj.Value }; // 此时tempObj是新实例,修改它不会影响myObj
如何让字典赋值后互不影响
如果想让tempDict成为独立字典,需要创建原字典的副本,比如:
var tempDict = new Dictionary<string, string>(demoDict);
这样tempDict就是新的Dictionary实例,复制了原字典的键值对,后续修改不会影响原字典。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

