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

Person aPerson=allPersons[0]; 

aPerson.Name="test1"; 

allPersons.Add(aPerson) 

allPersons有一個單身人士的對象,我分配的那個人對象進入「aPerson」 object.Just重命名人名字爲「測試1」,並再次將其添加到列表中。問題的列表<T>對象

現在,如果我們檢查列表,則兩個人的對象的名稱都被指定爲'test1'。

這是什麼問題?

我們如何理清這一點?

+0

如果這應該是C#,則需要雙引號字符串並添加一個';' – CodesInChaos

回答

7

您需要複製該對象。您只是將引用複製到同一個對象。所以這兩個條目都指向同一個人。

如果Person實現IClonable,則可以調用Clone(),修改克隆並將其添加到列表中。

2

你總是與同一個對象的工作,你把它添加到列表中,把它拿出來,修改它,在第二位置再次添加...

類是引用類型的多少所以不管你把它放在變量中的變量總是引用內存中的同一個對象,並且你從某個地方改變它,所有的引用都會看到相同的更新數據。

0

Person aPerson = allPersons [0]僅複製List中項目的引用。

您需要使用'new'來創建對象的新實例,否則它實際上會複製指針,任何更改都只會影響一個對象。

List allPersons= ReadallPersons() 

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

aPerson.Name='test1' 

allPersons.Add(aPerson) 

或者您可以執行對象的DeepCopy,請參閱How do you do a deep copy of an object in .NET (C# specifically)?

2

列表存儲引用,而不是對象的副本。因此,當您修改對象的名稱並對其進行更改時,您將更改列表中的名稱以及存儲在aPerson中的名稱,因爲它是同一個對象。

要創建一個新對象,您需要使用new運算符並創建一個新的Person對象,然後將其添加到列表中。

0

當你這樣做......

Person aPerson = allPersons[0]; 

...你獲得reference以第一人稱的對象列表,即它是完全相同的項目,而不是一個副本。

有關如何製作副本,請參閱this question的最佳答案。