如果我在字典中放置一个对象,它是否成为指针?
我有以下字典:
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,为什么?
如何防止这种情况?
答案 0 :(得分:2)
您正在为字典中的多个键添加相同的类对象,但所有这些对象都指向同一个对象,这就是为什么当您更改一个对象时,您会看到字典中的更改。您需要复制类对象,然后将其添加到字典中。
您可以在Stackoverflow上看到此讨论:How do you do a deep copy an object in .Net (C# specifically)?。
除此之外,您可以摆脱对密钥的检查,因为您正在检查密钥是否不存在添加,否则更新。你可以这样做:
private void Update(string Name)
{
if (Name== null || Name=="")
return;
Dic[Name] = MyClass;
}
哪个会做同样的(如果不存在则添加,如果存在则更新)
答案 1 :(得分:1)
因为您输入的课程是引用,所以当您在某处更改它时,它也会“改变”(它实际上并没有改变那里,它只会在一个地方发生变化,但我们都在看同样的事情,可以这么说。所以,它与字典无关,而是.NET的机制。
如果将值类型放入,例如整数,然后更改变量值,则不会看到此类更改。您可以根据您的情况定义结构,这些结构是值类型,您可以“重复使用”类型,而不需要“级联更改”。
答案 2 :(得分:1)
没有。并且是的。你从不“把字符串放在字典中” - 你实际上把一个引用放到字典中。引用指向原始对象:未克隆对象。
如果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);
}
这里的区别是我们有多少个物体。
答案 3 :(得分:0)
因为班级是reference type。这意味着该类型的每个变量都是该类型的指针。
答案 4 :(得分:0)
您的类是引用类型,因此Dictionary包含它的内存链接。实际上,您可以在reference types和value types
查看更多内容