1

如果我将一个对象放入字典中,它是否会变成一个指针?

我有以下字典:

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

我怎样才能防止这种情况?

4

5 回答 5

2

您针对字典中的多个键添加相同的类对象,但它们都指向同一个对象,这就是为什么当您更改一个对象时,您会看到整个字典的更改。您需要复制您的类对象,然后将其添加到字典中。

您可能会看到以下讨论:How do you do a deep copy an object in .Net (C# 特别是)?在 Stackoverflow 上。

除此之外,您可以摆脱对密钥的检查,因为您正在检查密钥是否不存在添加,否则更新。你可以简单地做:

private void Update(string Name)
    {
        if (Name== null || Name=="")
            return;
        Dic[Name] = MyClass;
    }

哪个会做同样的事情(如果不存在则添加,如果存在则更新)

于 2013-03-07T10:30:08.443 回答
1

因为你输入的类是引用的,所以当你在某个地方改变它时,它也在那里“改变”(它并没有真正改变它只是在一个地方改变,但我们都在看同一件事, 可以这么说)。所以,这与字典无关,而是.NET 的机制。

如果您将值类型(例如整数)放入其中,然后更改变量值,您将不会看到此类更改。如果适合您的情况,您可以定义结构,它们是值类型,并且您可以“重用”该类型而无需“级联更改”。

于 2013-03-07T10:28:02.313 回答
1

不。而且是的。您永远不会“将对象放入字典中”-实际上您将对对象的引用放入字典中。引用指向原始对象:该对象未被克隆。

如果Class1是 a struct,那么当您访问或插入它时,它确实会被复制。

用人类的话来说:参考是房子的书面地址,比如说。很多人都可以拥有该地址的副本。如果有人去房子里把门涂成红色,那么每个看到那个地址的人都会看到。

(我想我从乔恩那里偷了这个比喻;对不起乔恩)

听起来你正在做类似的事情:

MyClass obj = new MyClass();
foreach(var name in names) {
    obj.Update(name);
}

当你应该做的时候:

foreach(var name in names) {
    MyClass obj = new MyClass();
    obj.Update(name);
}

这里的区别是我们有多少对象。

于 2013-03-07T10:28:42.087 回答
0

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

于 2013-03-07T10:28:41.537 回答
0

您的类是引用类型,因此 Dictionary 包含它的内存链接。实际上,您可以在引用类型值类型中查看更多信息

于 2013-03-07T10:30:42.613 回答