字典中的值是否成为指针?

时间:2013-03-07 10:26:06

标签: c# dictionary

如果我在字典中放置一个对象,它是否成为指针?

我有以下字典:

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,为什么?

如何防止这种情况?

5 个答案:

答案 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)

没有。并且是的。你从不“把字符串放在字典中” - 你实际上把一个引用放到字典中。引用指向原始对象:未克隆对象。

如果Class1struct,则无论何时访问或插入它都会被复制。

从人的角度来说:参考是房子的书面地址,比方说。很多人都可以拥有该地址的副本。如果有人去了房子并把门涂成了红色,那么看到那个地址的所有人就可以看到。

(我想我从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 typesvalue types

查看更多内容