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。