2011-06-24 10 views
0
List<Person> allPersons= ReadallPersons() 

Person aPerson=allPersons[0]; 

aPerson.Name="test1"; 

allPersons.Add(aPerson) 

AllPersonsというは1つの人物オブジェクトを持って、私は「test1の」のように人物名の名前を変更する「aPerson」object.Justにその人のオブジェクトを割り当て、再びリストに追加しています。問題<T>オブジェクト

ここでリストをチェックすると、両方の人物の名前が「test1」として割り当てられています。

この問題は何ですか?

どうすればこの問題を解決できますか?

+0

これがC#であることになっている場合は、文字列を二重引用符で囲み、 ';'を追加する必要があります。 – CodesInChaos

答えて

7

オブジェクトのコピーを作成する必要があります。参照を同じオブジェクトにコピーするだけです。したがって、両方のエントリは同じPersonを指しています。

PersonがIClonableを実装している場合は、Clone()を呼び出して、そのクローンを変更してリストに追加できます。あなたはいつも同じオブジェクトを操作している

2

、あなたは、リストに追加し、それを取り出して、それを修正し、第二の位置に再度追加...

クラスはありませんので問題でどのように多くの参照型ですあなたが置いた変数は、常に同じオブジェクトをメモリ内で参照し、どこかから変更して、すべての参照が同じ更新データを参照します。

0

人aPerson = allPersons [0]は、リスト内の項目の参照のみをコピーします。

オブジェクトの新しいインスタンスを作成するには 'new'を使用する必要があります。そうでない場合は、実際にポインタをコピーして変更を加えると1つのオブジェクトになります。

List allPersons= ReadallPersons() 

**Person aPerson= new Person();** 

aPerson.Name='test1' 

allPersons.Add(aPerson) 

How do you do a deep copy of an object in .NET (C# specifically)?を参照して、オブジェクトのDeepCopyを実行できます。

2

リストには、オブジェクトのコピーではなく、参照が格納されます。その結果、オブジェクトの名前を変更して変更すると、同じオブジェクトであるため、リスト内のオブジェクトとaPersonに格納されているオブジェクトの両方が変更されます。

新しいオブジェクトを作成するには、new演算子を使用して新しいPersonオブジェクトを作成し、それをリストに追加する必要があります。

0

あなたは...

Person aPerson = allPersons[0]; 

...あなたはすなわち、それはまったく同じアイテムではなく、コピーされ、リストの最初の人物オブジェクトにreferenceを得ています。

コピーの作成方法は、this questionの上の回答を参照してください。