C# 使用两个列表复制.NET上的内存

C# 使用两个列表复制.NET上的内存,c#,.net,sortedlist,C#,.net,Sortedlist,我正在.NET上开发一个小应用程序,我需要用两个不同的列表指向相同的数据,我想知道内存是否重复 public class Person { public string name; public int age; .... public Person(name, age) { this.name = name; this.age = age; } } SortedList<string> names;

我正在.NET上开发一个小应用程序,我需要用两个不同的列表指向相同的数据,我想知道内存是否重复

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);
将更改两个列表中的对象

是这样吗


谢谢。

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


如果你想省去这一点,我建议重载“=”操作符(显式)

因为
Person
是一个类,你只需要在列表中添加一个引用,所以每个列表都有一个对同一个人的引用。
Person
对象实际上不会重复,而
names[“juan”]
将取消对原始对象的引用

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

  • 23岁的人可能不止一人<代码>分类列表不喜欢这样
  • 通过
    names[“juan”]
    更改年龄不会自动更新
    ages
    <代码>年龄[24]将失败

如果
Person
是一个
struct
,那么
Person
将在每次分配时被复制(但是:这不是
struct
;不要这样做)

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

bool equals = ReferenceEquals(obj1, obj2); 
//in your case, obj1 = names["juan"], and obj2 = ages[23]
如果引用相同,这意味着对它的任何更改都将反映在引用同一对象的变量上


在您的情况下,是的,它们在两个列表中都是相同的引用。。因此,如果你在参考资料上做任何事情,无论是在
person1
姓名[“juan”]
还是
年龄[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
Person-person1=新人();
SortedList name=新的SortedList();
SortedList ages=新的SortedList();
姓名。添加(“juan”,第1人);
增列年龄(23人,1人);
//姓名[“juan”]。年龄
//年龄[23]
//等

覆盖操作员会有什么帮助?没有任何地方可以使用它谢谢,我只是在处理非常大的列表,我担心它们会复制数据。我只使用那个类,例如,我的真实对象更复杂。创建一个复制构造函数@user2004810不,你不能在C中这样做,实际上我想成为两个不同列表中的同一个对象
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