5

我正在.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

将更改两个列表中的对象。

这样对吗?

谢谢你。

4

3 回答 3

5

因为Person是一个类,所以您只是将引用放入列表中,因此每个列表都会引用同一个人。该Person对象确实不会被复制,names["juan"]并将取消引用原始对象。

然而!这并不能使代码完美无缺:

  • 可能有超过一名 23 岁的人;SortedList<,>不会喜欢的
  • 更改年龄names["juan"]不会自动更新agesages[24]将失败

如果Person是 a struct,那么每次分配它时Person 都会struct复制 (但是:这不是 a 的好候选;不要那样做)

于 2013-01-24T10:29:58.040 回答
1

要测试引用相等性,您始终可以执行以下操作:

bool equals = ReferenceEquals(obj1, obj2); 
//in your case, obj1 = names["juan"], and obj2 = ages[23]

如果引用相同,则意味着对它的任何更改都将反映在引用同一对象的变量上。


在您的情况下,是的,它们只是两个列表中的相同引用。因此,如果您对引用执行任何操作,无论是 on person1names["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
于 2013-01-24T10:31:49.087 回答
0

是的,这将更改两个列表中的对象。

如果您想为此提供建议,我建议重载“=”运算符(显式)

于 2013-01-24T10:26:55.767 回答