我正在研究.NET上的一个小应用程序,我需要用2个不同的列表指出相同的数据,我想知道是否内存是重复的,例如
public class Person
{
public string name;
public int age;
....
public Person(name, age)
{
this.name = name;
this.age = age;
}
}
SortedList<string> names;
SortedList<int> ages;
Person person1 = new Person("juan",23);
names.add("juan",person1);
ages.add(23,person1);
我猜.NET作为Java不会复制对象Person,因此它会保留,所以如果我这样做:
names("juan").age = 24
将更改两个列表中的对象。
是不是?
谢谢。
答案 0 :(得分:5)
由于Person
是一个类,因此您只将引用放入列表中,因此每个列表都会有一个引用给同一个人。 Person
对象确实不会重复,names["juan"]
将取消引用原始对象。
然而!这并没有使代码完美无缺:
SortedList<,>
不会喜欢names["juan"]
更改年龄不会自动更新ages
; ages[24]
将失败如果Person
是struct
,则每次分配时都会复制Person
(但是:这不是一个很好的候选者) struct
;不要这样做)
答案 1 :(得分:1)
要测试参考相等性,您始终可以执行以下操作:
bool equals = ReferenceEquals(obj1, obj2);
//in your case, obj1 = names["juan"], and obj2 = ages[23]
如果引用相同则意味着对它的任何更改都将反映在引用同一对象的变量上。
在您的情况下,是的,它们在两个列表中都是相同的引用。因此,如果您对引用执行任何操作,请将其放在person1
,names["juan"]
或ages[23]
上到处反映。也就是说,您的收藏应该如下:
Person person1 = new Person();
SortedList<string, Person> names = new SortedList<string, Person>();
SortedList<int, Person> ages = new SortedList<int, Person>();
names.Add("juan", person1);
ages.Add(23, person1);
//names["juan"].age
//ages[23].age
//etc
答案 2 :(得分:0)
是的,这将改变两个列表中的对象。
如果你想提供这个,我建议重载“=”运算符(显式)