它在字典中的值变成了一个指针
本文关键字:指针 一个 字典 | 更新日期: 2023-09-27 18:02:47
如果我把一个对象放入字典,它是否会变成一个指针?
我有以下字典:
public Dictionary<string, Class1> Dic{ get; set; }
在下面的函数中,我更新/添加字典
private void Update(string Name)
{
if (Name== null || Name=="")
return;
if (Dic.ContainsKey(Name))
{
Dic[Name] = MyClass;
}
else
{
Dic.Add(Name, MyClass);
}
}
MyClass是与字典在同一个类中的变量
public Class1 MyClass { get; set; }
当我改变类我调用更新函数,我看到所有的字典包含相同的值:当前MyClass,为什么?
我该如何预防?
您正在针对字典中的多个键添加相同的类对象,但它们都指向相同的对象,这就是为什么当您更改一个对象时,您会看到整个字典中的更改。您需要复制类对象,然后将其添加到字典中。
你可能会看到这样的讨论:如何在。net(特别是c#)中对对象进行深度复制?Stackoverflow。
除此之外,您可以取消对键的检查,因为您正在检查键是否不存在add,否则更新。您可以简单地执行:
private void Update(string Name)
{
if (Name== null || Name=="")
return;
Dic[Name] = MyClass;
}
将做相同的(添加如果不存在和更新如果存在)
因为你放入的类是通过引用,所以当你改变它的某个地方时,它也在那里'改变'(它并没有真正改变那里,它只在一个地方改变,但我们都在看同样的事情,可以这么说)。因此,这与字典没有任何关系,而是与。net的机制有关。
如果您放入一个值类型,例如一个整数,然后更改变量值,则不会看到这种更改。如果适合你的情况,你可以定义结构,它们是值类型,你可以"重用"这种类型,而不需要"级联更改"。
No。和sort-of-yes。你从来没有"把一个对象放到字典里"——你实际上是把一个对象的引用放到字典里。引用指向原始对象:该对象未被克隆。
如果Class1
是struct
,那么无论何时访问它或插入它,它都将被复制。
在人类的术语中:参考是一个房子的书面地址,比如说。很多人都有那个地址的副本。如果有人去房子把门漆成红色,那么每个看到那个地址的人都能看到。
(我想我是从Jon那里偷来这个比喻的;对不起Jon)
它听起来就像你在做这样的事情:
MyClass obj = new MyClass();
foreach(var name in names) {
obj.Update(name);
}
当你应该做:
foreach(var name in names) {
MyClass obj = new MyClass();
obj.Update(name);
}
因为class是引用类型。这意味着该类型的每个变量都是指向该类型的指针
你的类是一个引用类型,所以字典包含它的内存链接。实际上你可以查看更多引用类型和值类型