它在字典中的值变成了一个指针

本文关键字:指针 一个 字典 | 更新日期: 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。你从来没有"把一个对象放到字典里"——你实际上是把一个对象的引用放到字典里。引用指向原始对象:该对象未被克隆。

如果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);
}

因为class是引用类型。这意味着该类型的每个变量都是指向该类型的指针

你的类是一个引用类型,所以字典包含它的内存链接。实际上你可以查看更多引用类型和值类型