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

C# 字典中的值是否成为指针?,c#,dictionary,C#,Dictionary,如果我把一个对象放到字典里,它是否会变成指针 我有以下字典: public Dictionary<string, Class1> Dic{ get; set; } MyClass是一个与字典位于同一个类中的变量 private void Update(string Name) { if (Name== null || Name=="") return; if (Dic.ContainsKey(Name))

如果我把一个对象放到字典里,它是否会变成指针

我有以下字典:

public Dictionary<string, Class1> Dic{ get; set; }
MyClass是一个与字典位于同一个类中的变量

    private void Update(string Name)
    {
        if (Name== null || Name=="")
            return;
        if (Dic.ContainsKey(Name))
        {
            Dic[Name] = MyClass;
        }
        else
        {
            Dic.Add(Name, MyClass);
        }
    }
public Class1 MyClass { get; set; }
当我将调用的类更改为update函数时,我看到所有字典都包含相同的值:current MyClass,为什么


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

因为您输入的类是通过引用的,所以当您在某个地方更改它时,它也会在那里“更改”,在那里它也不会真正更改,它只在一个地方更改,但可以说,我们都在看同一件事。因此,这与词典无关,而是与.NET的机制有关


如果您输入一个值类型,比如一个整数,然后更改变量值,您将看不到这些变化。如果适合您的情况,您可以定义结构,这些结构是值类型,并且您可以“重用”类型,而无需“级联更改”。

因为您放入的类是通过引用的,所以当您在某个地方更改它时,它也会在那里“更改”,在那里它不会真正更改,它只会在一个地方更改,但可以说,我们都在看同一件事。因此,这与词典无关,而是与.NET的机制有关

如果您输入一个值类型,比如一个整数,然后更改变量值,您将看不到这些变化。如果适合您的情况,您可以定义结构,这些结构是值类型,并且您可以在不进行“级联更改”的情况下“重用”该类型。

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

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

否。有点像是。你从来没有把和对象放在字典里-你实际上把一个对象的引用放在字典里。原始对象的参照点:未克隆该对象

如果Class1是一个结构,那么无论何时访问或插入它,它都会被复制

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

我想我偷了乔恩的这个比喻;对不起,乔恩

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

MyClass obj = new MyClass();
foreach(var name in names) {
    obj.Update(name);
}
当你应该做的时候:

foreach(var name in names) {
    MyClass obj = new MyClass();
    obj.Update(name);
}
这里的区别是我们有多少个物体。

没有。有点像是。你从来没有把和对象放在字典里-你实际上把一个对象的引用放在字典里。原始对象的参照点:未克隆该对象

如果Class1是一个结构,那么无论何时访问或插入它,它都会被复制

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

我想我偷了乔恩的这个比喻;对不起,乔恩

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

MyClass obj = new MyClass();
foreach(var name in names) {
    obj.Update(name);
}
当你应该做的时候:

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

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

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

您可能会看到以下讨论:关于Stackoverflow

除此之外,您可以取消对密钥的检查,因为您正在检查密钥是否不存在添加,否则更新。您可以简单地执行以下操作:

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

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

您可能会看到以下讨论:关于Stackoverflow

除此之外,您可以取消对密钥的检查,因为您正在检查密钥是否不存在添加,否则更新。您可以简单地执行以下操作:

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

如果类是引用类型,那么Dictionary包含它的内存链接。实际上,您可以在上查看更多信息,并且您的类是引用类型,所以字典包含它的内存链接。事实上,你可以在和

处检查更多,对该对象的引用会更好;指针有一个不同的用法,它不是指一个类型,对那个对象的引用会更好;指针有不同的用法,它不是指类型。我对这个问题投了赞成票,因为我认为它涵盖了引用和值类型的重要一课
在字典中添加多个值时,我们无法真正评论它们如何包含同一个值:CurrentMyClass。最明显的答案是:因为你告诉它,在每个键上添加相同的对象。我对这个问题投了赞成票,因为我认为它涵盖了引用和值类型方面的一个重要课程。除非你展示一些代码,说明如何/在何处向字典中添加多个值,我们无法评论它们是如何包含相同的值的:CurrentMyClass。最明显的答案是:因为你告诉它,通过在每个键上添加相同的对象。@Derek我已经要求OP澄清这一点,但是是的,听起来他们在多个键上添加相同的对象引用我认为你是对的,看起来每次更新都在使用同一个对象,而不是一个新的初始化对象,很好的类比,即使它是被盗的lol.@Derek我已经要求OP澄清这一点,但是是的,听起来他们好像在对多个键添加相同的对象引用我认为你是对的,看起来好像每次更新都在使用同一个对象,而不是一个初始化的新对象,很好的类比,即使它是被盗的lol。