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);

Javaとしての.NETはオブジェクト Person を複製しないので、保持されると思います。

names("juan").age = 24

両方のリストのオブジェクトを変更します。

そうですか?

ありがとうございました。

4

3 に答える 3

5

Personはクラスであるため、リストに参照を追加するだけで、各リストには同じ人物への参照が含まれます。Personオブジェクトは実際には複製されず、元のnames["juan"]オブジェクトを参照解除します。

でも!それはコードを完璧にするわけではありません:

  • 23歳の人が複数いる可能性があります。SortedList<,>気に入らない
  • を介して年齢を変更しても、names["juan"]自動的には更新されませんagesages[24]失敗します

だった場合Personは、struct割り当てるたびにコピーされます(ただし、これは;の適切な候補ではPerson ありstructません。そうしないでください)

于 2013-01-24T10:29:58.040 に答える
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
于 2013-01-24T10:31:49.087 に答える
0

はい、これにより、両方のリストのオブジェクトが変更されます。

これを提供したい場合は、「=」演算子をオーバーロードすることをお勧めします(明示的)

于 2013-01-24T10:26:55.767 に答える